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?


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.


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


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


Ś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";
}

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)

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";
}

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


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


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
}

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';
    }   

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";

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)

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" }

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';

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.


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%"


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


-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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.