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?
Odpowiedzi:
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.
źródło
else
bloku musi znajdować się poniżejforeach
pętli.**Note**: If you only want to determine if a particular needle occurs within haystack, use the faster and less memory intensive function strpos() instead.
site3.com
. Będzie pasować,mysite3.com
kiedy nie powinnoSpró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
źródło
My url is https://website3.com
Prosty
str_replace
z 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
źródło
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"; }
źródło
$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)
źródło
create_function
jest przestarzałe w PHP 7.2Myś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"; }
źródło
addcslashes(implode('|', $owned_urls_array, '.'))
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
Funkcja striptizu nie jest zbyt ścisła. wielkość liter nie jest rozróżniana lub może pasować do części słowa http://php.net/manual/ro/function.stripos.php
jeśli chcesz, aby wyszukiwanie uwzględniało wielkość liter, użyj strpos http://php.net/manual/ro/function.strpos.php
aby uzyskać dokładne dopasowanie, użyj wyrażenia regularnego ( preg_match ), sprawdź odpowiedź tego gościa https://stackoverflow.com/a/25633879/4481831
źródło
stripos
Jeśli twój
$string
jest zawsze spójny (tj. Nazwa domeny znajduje się zawsze na końcu ciągu), możesz użyćexplode()
withend()
, 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
źródło
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 }
źródło
$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'; }
źródło
Sprawdzasz cały ciąg do wartości tablicy. Więc wyjście jest zawsze
false
.Używam obu
array_filter
iwstrpos
tym 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";
źródło
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)
źródło
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" }
źródło
$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';
źródło
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!
Utwórz nową zmienną,
$newStr
zastępując wartość w tablicy oryginalnego ciągu.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.
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.
źródło
$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
dawny:
źródło
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
źródło
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.
źródło