@Dave um snippet atualizado de 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);
}
Como usar:
$string = 'Whis string contains word "cheese" and "tea".';
$array = array('burger', 'melon', 'cheese', 'milk');
if (strposa($string, $array, 1)) {
echo 'true';
} else {
echo 'false';
}
vai voltar true
, por causa de array
"cheese"
.
Atualização: Código aprimorado com parada quando a primeira das agulhas é encontrada:
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; // stop on first true result
}
return false;
}
$string = 'Whis string contains word "cheese" and "tea".';
$array = array('burger', 'melon', 'cheese', 'milk');
var_dump(strposa($string, $array)); // will return true, since "cheese" has been found
strposa
percorrerá todo o texto, mas não é necessário! Eu sou compreensível?foreach($needle as $k => $query) { if(strpos($haystack, $query, $offset) !== false) return $k; }
, então ele retorna a chave do item correspondente para tratamento posterior.str_replace é consideravelmente mais rápido.
fonte
O código abaixo não apenas mostra como fazer isso, mas também o coloca em uma função fácil de usar no futuro. Foi escrito por "jesda". (Eu encontrei online)
Código PHP:
Uso:
fonte
Você pode iterar pela matriz e definir um valor "sinalizador" se
strpos
retornarfalse
.Em seguida, verifique o valor de
$flag
.fonte
!== flase
?Se você deseja apenas verificar se certos caracteres estão realmente na string ou não, use strtok :
fonte
A questão: o exemplo fornecido é apenas um "exemplo" ou é exatamente o que você está procurando? Existem muitas respostas misturadas aqui, e eu não entendo a complexidade da aceita.
Para descobrir se ALGUM conteúdo da matriz de agulhas existe na string e retornar rapidamente verdadeiro ou falso:
Em caso afirmativo, dê crédito a @Leon por isso.
Para descobrir se TODOS os valores da matriz de agulhas existem na string, como neste caso, todos os três
'a', 'b'
e'c'
DEVEM estar presentes, como você mencionou como seu "por exemplo"Muitas respostas aqui estão fora desse contexto, mas duvido que a intenção da pergunta que você marcou como resolvida. Por exemplo, a resposta aceita é uma agulha de
E se todas essas palavras DEVEM ser encontradas na string?
Então você experimenta alguns
"not accepted answers"
nesta página.fonte
Esta expressão procura todas as letras:
fonte
Você pode tentar isto:
fonte
Você também pode tentar usar strpbrk () para a negação (nenhuma das letras foi encontrada):
fonte
Esta é a minha abordagem. Repita os caracteres da string até que uma correspondência seja encontrada. Em uma gama maior de agulhas, isso superará a resposta aceita porque não precisa verificar todas as agulhas para determinar se uma correspondência foi encontrada.
Eu comparei isso com a resposta aceita e com um array de mais de 7
$needles
isso foi dramaticamente mais rápido.fonte
Com o seguinte código:
Em seguida, verifique o valor de
$flag
. Se fortrue
, todas as letras foram encontradas. Se não, éfalse
.fonte
Estou escrevendo uma nova resposta que espero ajudar qualquer pessoa que esteja procurando algo semelhante ao que eu sou.
Isso funciona no caso de "Eu tenho várias agulhas e estou tentando usá-las para localizar um fio isolado". e esta é a pergunta que eu encontrei para descobrir isso.
O array
$found
conterá uma lista de todas as agulhas correspondentes, o item do array com o valor de contagem mais alto será a (s) string (s) que você está procurando, você pode conseguir isso com:fonte
Responder a @binyamin e @Timo .. (não há pontos suficientes para adicionar um comentário ..) mas o resultado não contém a posição ..
O código abaixo retornará a posição real do primeiro elemento que é o que strpos se destina a Faz. Isso é útil se você espera encontrar exatamente 1 correspondência. Se espera encontrar várias correspondências, a posição da primeira encontrada pode não ter significado.
fonte
Apenas uma atualização das respostas acima
fonte