Sprawdź, czy ciąg zawiera wartość w tablicy

84

Próbuję wykryć, czy ciąg zawiera co najmniej jeden adres URL przechowywany w tablicy.

Oto moja tablica:

$owned_urls = array('website1.com', 'website2.com', 'website3.com');

Ciąg jest wprowadzany przez użytkownika i przesyłany przez PHP. Na stronie potwierdzenia chciałbym sprawdzić, czy wpisany adres URL znajduje się w tablicy.

Próbowałem następujących rzeczy:

$string = 'my domain name is website3.com';
if (in_array($string, $owned_urls))
{
    echo "Match found"; 
    return true;
}
else
{
    echo "Match not found";
    return false;
}

Bez względu na to, co zostanie wprowadzone, zwrot zawsze brzmi „Nie znaleziono dopasowania”.

Czy to właściwy sposób robienia rzeczy?

danyo
źródło
Sprawdź moją odpowiedź, myślę, że okaże się przydatna.
FarrisFahad

Odpowiedzi:

90

Spróbuj tego.

$string = 'my domain name is website3.com';
foreach ($owned_urls as $url) {
    //if (strstr($string, $url)) { // mine version
    if (strpos($string, $url) !== FALSE) { // Yoshi version
        echo "Match found"; 
        return true;
    }
}
echo "Not found!";
return false;

Użyj stristr () lub stripos (), jeśli chcesz sprawdzić, czy wielkość liter nie ma znaczenia.

Daniele Vrut
źródło
3
Prawie - to wyświetli echo „Nie znaleziono dopasowania” i zwróci fałsz, jeśli pierwszy adres URL na liście nie pasuje, nawet jeśli jest inny. Zawartość elsebloku musi znajdować się poniżej foreachpętli.
Ulrich Schmidt-Goertz
Dzięki, że to zauważyłeś. Właśnie poprawiłem moją odpowiedź.
Daniele Vrut
Przegapiłeś również ")" po $ string :)
danyo
7
z instrukcji:**Note**: If you only want to determine if a particular needle occurs within haystack, use the faster and less memory intensive function strpos() instead.
Yoshi
5
@danyo to nie zadziała, jeśli użytkownik wejdzie na domenę, taką jak site3.com. Będzie pasować, mysite3.comkiedy nie powinno
billyonecan
23

Spróbuj tego:

$owned_urls= array('website1.com', 'website2.com', 'website3.com');

$string = 'my domain name is website3.com';

$url_string = end(explode(' ', $string));

if (in_array($url_string,$owned_urls)){
    echo "Match found"; 
    return true;
} else {
    echo "Match not found";
    return false;
}

- Dzięki

Anand Solanki
źródło
8
Zakłada się, że ciągi są oddzielone spacją. np. nie będzie działać dla następującego łańcuchaMy url is https://website3.com
Елин Й.
4
a nawet nie będzie działać dla „Mam domenę website3.com”. Zakłada się, że ciąg jest na końcu, czego nie możesz podczas pracy z tekstem
zatwierdzonym
20

Prosty str_replacez parametrem count zadziała tutaj:

$count = 0;
str_replace($owned_urls, '', $string, $count);
// if replace is successful means the array value is present(Match Found).
if ($count > 0) {
  echo "One of Array value is present in the string.";
}

Więcej informacji - https://www.techpurohit.com/extended-behaviour-explode-and-strreplace-php

jitendrapurohit
źródło
Świetnie, mam jedną wątpliwość… to działa dobrze przy dopasowywaniu adresu URL ciągu… Mam ciąg $ string = 'jesteś-jesteś-miły'; $ string2 = 'jesteś milszy'; a my $ match = 'nice'; Muszę dopasować słowo ładne, nie ładniejsze, nawet jeśli mój ciąg dopasowania jest ładny ...
Srinivas08
16

Było to o wiele łatwiejsze do zrobienia, jeśli wszystko, co chcesz zrobić, to znaleźć ciąg w tablicy.

$array = ["they has mystring in it", "some", "other", "elements"];
if (stripos(json_encode($array),'mystring') !== false) {
echo "found mystring";
}
Joseph Philbert
źródło
2
Twoja tablica wejściowa jest w rzeczywistości ciągiem.
Burgi
3
Myślę, że to NAJLEPSZA ODPOWIEDŹ, ale nie otrzymałem głosów za z powodu prostego błędu w kodzie. @Burgi Edytowałem odpowiedź i teraz jest to tablica, a nawet więcej, wiele tablic podrzędnych, a jego metoda nadal działa bardzo dobrze !!
Tarik
Działa to dobrze, ale nie mówi ci, z którym kluczem dopasowana tablica.
ahinkle
8
$string = 'my domain name is website3.com';
$a = array('website1.com','website2.com','website3.com');

$result = count(array_filter($a, create_function('$e','return strstr("'.$string.'", $e);')))>0; 
var_dump($result );

wynik

bool(true)
RafH
źródło
2
na przykład; create_functionjest przestarzałe w PHP 7.2
Darryl E. Clarke
6

Myślę, że szybszym sposobem jest użycie preg_match .

$user_input = 'Something website2.com or other';
$owned_urls_array = array('website1.com', 'website2.com', 'website3.com');

if ( preg_match('('.implode('|',$owned_urls_array).')', $user_input)){
    echo "Match found"; 
}else{
    echo "Match not found";
}
venedor
źródło
4
Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie byłoby znacznie poprawić swoją długoterminową wartość pokazując dlaczego jest to dobre rozwiązanie problemu i byłoby bardziej użyteczne dla czytelników przyszłości z innymi, podobnymi pytaniami. Proszę edytować swoją odpowiedź dodać kilka wyjaśnień, w tym założeń już wykonanych. ref
Alper t. Turker
Myślę, że to lepsza odpowiedź
dryobs
Aby być bardziej bezpiecznym, kropki muszą być unikane we wzorze:addcslashes(implode('|', $owned_urls_array, '.'))
sucha
mniej kodu, ale zdecydowanie DUŻO wolniej niż strpos
hndcrftd
4

Oto minifunkcja, która wyszukuje wszystkie wartości z tablicy w podanym ciągu. Używam tego w mojej witrynie, aby sprawdzić, czy adres IP odwiedzających znajduje się na mojej liście dozwolonych na niektórych stronach.

function array_in_string($str, array $arr) {
    foreach($arr as $arr_value) { //start looping the array
        if (stripos($str,$arr_value) !== false) return true; //if $arr_value is found in $str return true
    }
    return false; //else return false
}

jak używać

$owned_urls = array('website1.com', 'website2.com', 'website3.com');

//this example should return FOUND
$string = 'my domain name is website3.com';
if (array_in_string($string, $owned_urls)) {
    echo "first: Match found<br>"; 
}
else {
    echo "first: Match not found<br>";
}

//this example should return NOT FOUND
$string = 'my domain name is website4.com';
if (array_in_string($string, $owned_urls)) {
    echo "second: Match found<br>"; 
}
else {
    echo "second: Match not found<br>";
}

DEMO: http://phpfiddle.org/lite/code/qf7j-8m09

crisc82
źródło
1
jest rozróżniana stripos
wielkość
3

Jeśli twój $stringjest zawsze spójny (tj. Nazwa domeny znajduje się zawsze na końcu ciągu), możesz użyć explode()with end(), a następnie użyć, in_array()aby sprawdzić dopasowanie (jak wskazał @Anand Solanki w ich odpowiedzi).

Jeśli nie, lepiej byłoby użyć wyrażenia regularnego do wyodrębnienia domeny z ciągu, a następnie użyć go in_array()do sprawdzenia dopasowania.

$string = 'There is a url mysite3.com in this string';
preg_match('/(?:http:\/\/)?(?:www.)?([a-z0-9-_]+\.[a-z0-9.]{2,5})/i', $string, $matches);

if (empty($matches[1])) {
  // no domain name was found in $string
} else {
  if (in_array($matches[1], $owned_urls)) {
    // exact match found
  } else {
    // exact match not found
  }
}

Powyższe wyrażenie prawdopodobnie można by poprawić (nie mam szczególnej wiedzy w tej dziedzinie)

Oto demo

billyonecan
źródło
2

Możesz połączyć wartości tablic za pomocą implodu i separatora | a następnie użyj preg_match, aby wyszukać wartość.

Oto rozwiązanie, które wymyśliłem ...

$emails = array('@gmail', '@hotmail', '@outlook', '@live', '@msn', '@yahoo', '@ymail', '@aol');
$emails = implode('|', $emails);

if(!preg_match("/$emails/i", $email)){
 // do something
}
FarrisFahad
źródło
powinno być zaznaczoną odpowiedzią na bycie eleganckim
ceyquem
1
$owned_urls= array('website1.com', 'website2.com', 'website3.com');
    $string = 'my domain name is website3.com';
    for($i=0; $i < count($owned_urls); $i++)
    {
        if(strpos($string,$owned_urls[$i]) != false)
            echo 'Found';
    }   
Sandesh
źródło
1

Sprawdzasz cały ciąg do wartości tablicy. Więc wyjście jest zawsze false.

Używam obu array_filteriw strpostym przypadku.

<?php
$urls= array('website1.com', 'website2.com', 'website3.com');
$string = 'my domain name is website3.com';
$check = array_filter($urls, function($url){
    global $string;
    if(strpos($string, $url))
        return true;
});
echo $check?"found":"not found";
revo
źródło
0

Nie używasz poprawnie funkcji in_array ( http://php.net/manual/en/function.in-array.php ):

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

$ Needle musi mieć wartość w tablicy, więc najpierw musisz wyodrębnić adres URL z ciągu (na przykład za pomocą wyrażenia regularnego). Coś takiego:

$url = extrctUrl('my domain name is website3.com');
//$url will be 'website3.com'
in_array($url, $owned_urls)
David Fernandes
źródło
0

Jeśli próbujesz uzyskać dokładne dopasowanie słowa (bez ścieżek w adresach URL)

$string = 'my domain name is website3.com';
$words = explode(' ', $string); 
$owned_urls= array('website1.com', 'website2.com', 'website3.com');
var_dump(array_intersect($words, $owned_urls));

Wynik:

array(1) { [4]=> string(12) "website3.com" }
Taha Paksu
źródło
0
    $message = "This is test message that contain filter world test3";

    $filterWords = array('test1', 'test2', 'test3');

    $messageAfterFilter =  str_replace($filterWords, '',$message);

    if( strlen($messageAfterFilter) != strlen($message) )
        echo 'message is filtered';
    else
        echo 'not filtered';
Tahir Jamil
źródło
0

Uważam, że to szybkie i proste bez pętli biegowej.

$array = array("this", "that", "there", "here", "where");
$string = "Here comes my string";
$string2 = "I like to Move it! Move it";

$newStr = str_replace($array, "", $string);

if(strcmp($string, $newStr) == 0) {
    echo 'No Word Exists - Nothing got replaced in $newStr';
} else {
    echo 'Word Exists - Some Word from array got replaced!';
}

$newStr = str_replace($array, "", $string2);

if(strcmp($string2, $newStr) == 0) {
    echo 'No Word Exists - Nothing got replaced in $newStr';
} else {
    echo 'Word Exists - Some Word from array got replaced!';
}

Małe wyjaśnienie!

  1. Utwórz nową zmienną, $newStrzastępując wartość w tablicy oryginalnego ciągu.

  2. Wykonaj porównanie ciągów - Jeśli wartość wynosi 0, oznacza to, że ciągi są równe i nic nie zostało zastąpione, stąd żadna wartość w tablicy nie istnieje w ciągu.

  3. jeśli jest odwrotnie do 2, tj. podczas porównywania ciągów nie dopasowano ani oryginalnego, ani nowego łańcucha, co oznacza, że ​​coś zostało zastąpione, stąd wartość w tablicy istnieje w łańcuchu.

user3767643
źródło
0
  $search = "web"
    $owned_urls = array('website1.com', 'website2.com', 'website3.com');
          foreach ($owned_urls as $key => $value) {
         if (stristr($value, $search) == '') {
        //not fount
        }else{
      //found
       }

jest to najlepsze podejście do wyszukiwania dowolnego podciągu, bez rozróżniania wielkości liter i szybkiego

tak jak im mysql

dawny:

wybierz * z tabeli, gdzie nazwa = "% web%"

Yahya Ayyoub
źródło
0

Wymyśliłem tę funkcję, która działa dla mnie, mam nadzieję, że to komuś pomoże

$word_list = 'word1, word2, word3, word4';
$str = 'This string contains word1 in it';

function checkStringAgainstList($str, $word_list)
{
  $word_list = explode(', ', $word_list);
  $str = explode(' ', $str);

  foreach ($str as $word):
    if (in_array(strtolower($word), $word_list)) {
        return TRUE;
    }
  endforeach;

  return false;
}

Zwróć również uwagę, że odpowiedzi z strpos () zwrócą wartość true, jeśli pasujące słowo jest częścią innego słowa. Na przykład, jeśli lista słów zawiera „st”, a ciąg znaków zawiera „ulicę”, strpos () zwróci wartość true

Da Beginer
źródło
-3

DZIĘKUJEMY za to - mogłem właśnie skorzystać z tej odpowiedzi na pierwotne pytanie, aby opracować prosty w użyciu moduł sprawdzania strony błędów 404, do użytku na niestandardowych stronach błędów 404.

Tutaj idzie:

Potrzebujesz tablicy livePages w swojej witrynie, poprzez tablicę / DB itp., Nawet lista twojego <dir>drzewa zrobi to z modyfikacjami:

Używając oryginalnego POMYSŁU, ale używając tekstu podobnego zamiast strpos, - daje to możliwość wyszukiwania nazw LIKE, więc pozwala również na TYPOS, dzięki czemu możesz unikać lub znajdować nazwy podobne do podobnych i wyglądających ...

<?php
// We need to GRAB the URL called via the browser ::
$requiredPage = str_replace ('/', '',$_SERVER[REQUEST_URI]);

// We need to KNOW what pages are LIVE within the website ::
$livePages = array_keys ($PageTEXT_2col );

foreach ($livePages as $url) {

if (similar_text($requiredPage,  $url, $percent)) {
    $percent = round($percent,2); // need to avoid to many decimal places ::
    //   if (strpos($string, $url) !== FALSE) { // Yoshi version
    if (round($percent,0) >= 60) { // set your percentage of "LIKENESS" higher the refiner the search in your array ::
        echo "Best Match found = " . $requiredPage . " > ,<a href='http://" . $_SERVER['SERVER_NAME'] . "/" . $url . "'>" . $url . "</a> > " . $percent . "%"; 
        return true;
    } 
}
}    
echo "Sorry Not found = " . $requiredPage; 
return false;
?>

Mam nadzieję, że to komuś pomoże, tak jak ten artykuł pomógł mi stworzyć bardzo proste wyszukiwanie / dopasowanie na stronie 404ErrorDoc.

Projekt strony umożliwi serwerowi przedstawienie prawdopodobnych dopasowań adresów URL do wszystkich wywoływanych adresów URL za pośrednictwem przeglądarki ...

To działa - i jest takie proste, być może są na to lepsze sposoby, ale ten sposób działa.

madesignUK
źródło