@Dave zaktualizowany fragment z http://www.php.net/manual/en/function.strpos.php#107351
function strposa($haystack, $needles=array(), $offset=0) {
$chr = array();
foreach($needles as $needle) {
$res = strpos($haystack, $needle, $offset);
if ($res !== false) $chr[$needle] = $res;
}
if(empty($chr)) return false;
return min($chr);
}
Jak używać:
$string = 'Whis string contains word "cheese" and "tea".';
$array = array('burger', 'melon', 'cheese', 'milk');
if (strposa($string, $array, 1)) {
echo 'true';
} else {
echo 'false';
}
powróci z true
powodu array
"cheese"
.
Aktualizacja: Ulepszony kod z zatrzymaniem po znalezieniu pierwszej z igieł:
function strposa($haystack, $needle, $offset=0) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $query) {
if(strpos($haystack, $query, $offset) !== false) return true;
}
return false;
}
$string = 'Whis string contains word "cheese" and "tea".';
$array = array('burger', 'melon', 'cheese', 'milk');
var_dump(strposa($string, $array));
strposa
przejdzie przez cały tekst, ale nie jest to konieczne! Czy jestem zrozumiały?foreach($needle as $k => $query) { if(strpos($haystack, $query, $offset) !== false) return $k; }
, więc zwraca klucz pasującego elementu do dalszej obsługi.str_replace jest znacznie szybszy.
$find_letters = array('a', 'c', 'd'); $string = 'abcdefg'; $match = (str_replace($find_letters, '', $string) != $string);
źródło
Poniższy kod nie tylko pokazuje, jak to zrobić, ale także umieszcza go w łatwej w użyciu funkcji posuwającej się naprzód. Został napisany przez „jesdę”. (Znalazłem to online)
Kod PHP:
<?php /* strpos that takes an array of values to match against a string * note the stupid argument order (to match strpos) */ function strpos_arr($haystack, $needle) { if(!is_array($needle)) $needle = array($needle); foreach($needle as $what) { if(($pos = strpos($haystack, $what))!==false) return $pos; } return false; } ?>
Stosowanie:
$needle = array('something','nothing'); $haystack = "This is something"; echo strpos_arr($haystack, $needle); // Will echo True $haystack = "This isn't anything"; echo strpos_arr($haystack, $needle); // Will echo False
źródło
Możesz iterować po tablicy i ustawić wartość „flagi”, jeśli
strpos
zwracafalse
.$flag = false; foreach ($find_letters as $letter) { if (strpos($string, $letter) === false) { $flag = true; } }
Następnie sprawdź wartość
$flag
.źródło
!== flase
?Jeśli chcesz tylko sprawdzić, czy określone znaki są rzeczywiście w ciągu, czy nie, użyj strtok :
$string = 'abcdefg'; if (strtok($string, 'acd') === $string) { // not found } else { // found }
źródło
Pytanie, czy podany przykład to tylko „przykład”, czy dokładnie to, czego szukasz? Jest tu wiele mieszanych odpowiedzi i nie rozumiem złożoności przyjętej.
Aby dowiedzieć się, czy JAKIEKOLWIEK zawartość tablicy igieł istnieje w ciągu znaków i szybko zwrócić prawdę lub fałsz:
$string = 'abcdefg'; if(str_replace(array('a', 'c', 'd'), '', $string) != $string){ echo 'at least one of the needles where found'; };
Jeśli tak, daj za to kredyt @Leon .
Aby dowiedzieć się, czy WSZYSTKIE wartości tablicy igieł istnieją w ciągu, tak jak w tym przypadku, wszystkie trzy
'a', 'b'
i'c'
MUSZĄ być obecne, tak jak wspominasz jako „na przykład”Wiele odpowiedzi tutaj jest poza tym kontekstem, ale wątpię, czy intencja pytania, którą określiłeś jako rozwiązana. Np. Zaakceptowaną odpowiedzią jest igła
$array = array('burger', 'melon', 'cheese', 'milk');
A jeśli wszystkie te słowa MUSZĄ znajdować się w ciągu?
Następnie wypróbuj kilka
"not accepted answers"
na tej stronie.źródło
To wyrażenie wyszukuje wszystkie litery:
count(array_filter( array_map("strpos", array_fill(0, count($letters), $str), $letters), "is_int")) == count($letters)
źródło
Możesz spróbować tego:
function in_array_strpos($word, $array){ foreach($array as $a){ if (strpos($word,$a) !== false) { return true; } } return false; }
źródło
Możesz także spróbować użyć strpbrk () do negacji (żadna z liter nie została znaleziona):
$find_letters = array('a', 'c', 'd'); $string = 'abcdefg'; if(strpbrk($string, implode($find_letters)) === false) { echo 'None of these letters are found in the string!'; }
źródło
To jest moje podejście. Iteruj po znakach w ciągu, aż zostanie znalezione dopasowanie. W przypadku większej liczby igieł będzie to lepsze od zaakceptowanej odpowiedzi, ponieważ nie trzeba sprawdzać każdej igły, aby stwierdzić, że znaleziono dopasowanie.
function strpos_array($haystack, $needles = [], $offset = 0) { for ($i = $offset, $len = strlen($haystack); $i < $len; $i++){ if (in_array($haystack[$i],$needles)) { return $i; } } return false; }
Porównałem to z zaakceptowaną odpowiedzią i przy tablicy ponad 7
$needles
było to znacznie szybsze.źródło
Z następującym kodem:
$flag = true; foreach($find_letters as $letter) if(false===strpos($string, $letter)) { $flag = false; break; }
Następnie sprawdź wartość
$flag
. Jeśli taktrue
, wszystkie litery zostały znalezione. Jeśli nie, to jestfalse
.źródło
Piszę nową odpowiedź, która, mam nadzieję, pomoże każdemu, kto szuka czegoś podobnego do tego, kim jestem.
Działa to w przypadku „Mam wiele igieł i próbuję ich użyć, aby znaleźć wyodrębniony sznurek”. i to jest pytanie, na które natknąłem się, aby je znaleźć.
$i = 0; $found = array(); while ($i < count($needle)) { $x = 0; while ($x < count($haystack)) { if (strpos($haystack[$x], $needle[$i]) !== false) { array_push($found, $haystack[$x]); } $x++; } $i++; } $found = array_count_values($found);
Tablica
$found
będzie zawierała listę wszystkich pasujących igieł, element tablicy o najwyższej wartości licznika będzie ciągiem, którego szukasz, możesz to uzyskać za pomocą:źródło
Odpowiedz na @binyamin i @Timo .. (za mało punktów, aby dodać komentarz ...), ale wynik nie zawiera pozycji ..
Poniższy kod zwróci rzeczywistą pozycję pierwszego elementu, do której ma służyć strpos zrobić. Jest to przydatne, jeśli spodziewasz się znaleźć dokładnie 1 dopasowanie. Jeśli spodziewasz się znaleźć wiele dopasowań, pozycja pierwszego znalezionego może być bez znaczenia.
function strposa($haystack, $needle, $offset=0) { if(!is_array($needle)) $needle = array($needle); foreach($needle as $query) { $res=strpos($haystack, $query, $offset); if($res !== false) return $res; // stop on first true result } return false; }
źródło
Tylko aktualizacja z powyższych odpowiedzi
function strsearch($findme, $source){ if(is_array($findme)){ if(str_replace($findme, '', $source) != $source){ return true; } }else{ if(strpos($source,$findme)){ return true; } } return false; }
źródło