@ Загрузите обновленный фрагмент с 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);
}
Как использовать:
$string = 'Whis string contains word "cheese" and "tea".';
$array = array('burger', 'melon', 'cheese', 'milk');
if (strposa($string, $array, 1)) {
echo 'true';
} else {
echo 'false';
}
вернется true
, из-за array
"cheese"
.
Обновление: улучшен код с остановкой при обнаружении первой иглы:
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
будет проходить через весь текст, но это не обязательно! Я вас понял?foreach($needle as $k => $query) { if(strpos($haystack, $query, $offset) !== false) return $k; }
, так что он возвращает ключ соответствующего элемента для дальнейшей обработки.str_replace значительно быстрее.
$find_letters = array('a', 'c', 'd'); $string = 'abcdefg'; $match = (str_replace($find_letters, '', $string) != $string);
источник
Приведенный ниже код не только показывает, как это сделать, но и превращает его в простую в использовании функцию. Это было написано "jesda". (Я нашел это в Интернете)
Код 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; } ?>
Применение:
$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
источник
Вы можете пройтись по массиву и установить значение «флага», если оно
strpos
вернетсяfalse
.$flag = false; foreach ($find_letters as $letter) { if (strpos($string, $letter) === false) { $flag = true; } }
Затем проверьте значение
$flag
.источник
!== flase
?Если вы просто хотите проверить, действительно ли определенные символы находятся в строке или нет, используйте strtok :
$string = 'abcdefg'; if (strtok($string, 'acd') === $string) { // not found } else { // found }
источник
Возникает вопрос, является ли предоставленный пример просто «примером» или именно тем, что вы ищете? Здесь много смешанных ответов, и я не понимаю сложности принятого.
Чтобы узнать, существует ли ЛЮБОЕ содержимое массива игл в строке, и быстро вернуть истину или ложь:
$string = 'abcdefg'; if(str_replace(array('a', 'c', 'd'), '', $string) != $string){ echo 'at least one of the needles where found'; };
Если да, пожалуйста, отдайте должное @Leon .
Чтобы узнать, существуют ли ВСЕ значения массива игл в строке, как в этом случае, все три
'a', 'b'
и'c'
ДОЛЖНЫ присутствовать, как вы упомянули как «например»Многие ответы здесь выходят за рамки этого контекста, но я сомневаюсь, что суть вопроса, как вы отметили, решена. Например, принятый ответ - игла
$array = array('burger', 'melon', 'cheese', 'milk');
Что, если все эти слова ДОЛЖНЫ быть найдены в строке?
Тогда вы можете попробовать что-нибудь
"not accepted answers"
на этой странице.источник
Это выражение ищет все буквы:
count(array_filter( array_map("strpos", array_fill(0, count($letters), $str), $letters), "is_int")) == count($letters)
источник
Вы можете попробовать это:
function in_array_strpos($word, $array){ foreach($array as $a){ if (strpos($word,$a) !== false) { return true; } } return false; }
источник
Вы также можете попробовать использовать strpbrk () для отрицания (ни одна из букв не найдена):
$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!'; }
источник
Это мой подход. Перебирайте символы в строке, пока не найдете совпадение. На большем массиве игл это превзойдет принятый ответ, потому что не нужно проверять каждую иглу, чтобы определить, найдено ли совпадение.
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; }
Я сравнил это с принятым ответом, и с массивом более 7
$needles
это было значительно быстрее.источник
Со следующим кодом:
$flag = true; foreach($find_letters as $letter) if(false===strpos($string, $letter)) { $flag = false; break; }
Затем проверьте значение
$flag
. Если даtrue
, то все буквы найдены. Если нет, то этоfalse
.источник
Я пишу новый ответ, который, надеюсь, поможет всем, кто ищет похожего на меня.
Это работает в случае «У меня несколько игл, и я пытаюсь использовать их, чтобы найти выделенную струну». и это вопрос, с которым я столкнулся, чтобы найти это.
$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);
Массив
$found
будет содержать список всех совпадающих игл, элементом массива с наибольшим значением счетчика будет строка (строки), которые вы ищете, вы можете получить это с помощью:источник
Ответьте на @binyamin и @Timo .. (недостаточно очков для добавления комментария ..), но результат не содержит позиции ..
Приведенный ниже код вернет фактическую позицию первого элемента, для которой предназначена strpos делать. Это полезно, если вы ожидаете найти ровно одно совпадение. Если вы ожидаете найти несколько совпадений, то позиция первого найденного может быть бессмысленной.
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; }
источник
Просто обновление выше ответов
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; }
источник