Considere:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
Suponha que eu tenha o código acima, qual é a maneira correta de escrever a declaração se ($a contém 'are')
?
Você pode utilizar a função strpos()
que é utilizada para encontrar a ocorrência de uma string dentro de outra:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
Note que o uso de !== falso
é deliberado (nem != falso
nem ==== verdadeiro
irá retornar o resultado desejado); strpos()
retorna ou o offset no qual a string da agulha começa na string do palheiro, ou o booleano false
se a agulha não for encontrada. Como 0 é um offset válido e 0 é "falsey", não podemos utilizar construções mais simples como !strpos($a, 'are')
.
Você poderia usar expressões regulares, é melhor para correspondência de palavras do que "strpos" como mencionado por outros usuários, também retornará verdadeiro para strings como tarifa, cuidado, olhar fixo, etc. Isto pode ser simplesmente evitado em expressões regulares, utilizando limites de palavras.
Uma simples partida para are poderia ser algo parecido com isto:
$a = 'How are you?';
if (preg_match('/\bare\b/', $a)) {
echo 'true';
}
No lado do desempenho, o 'strpos' é cerca de três vezes mais rápido e tem em mente, quando eu fiz um milhão de comparações ao mesmo tempo, levou preg_match
1,5 segundos para terminar e para o 'strpos' levou 0,5 segundos.
Editar: A fim de pesquisar qualquer parte da cadeia, não apenas palavra por palavra, eu recomendaria o uso de uma expressão regular como
$a = 'How are you?';
$search = 'are y';
if(preg_match("/{$search}/i", $a)) {
echo 'true';
}
O i
no final da expressão regular muda a expressão regular para ser insensível a maiúsculas e minúsculas, se você não quiser isso, você pode deixá-lo de fora.
Agora, isto pode ser bastante problemático em alguns casos já que a string $search não é higienizada de forma alguma, quero dizer, pode não passar a verificação em alguns casos como se $search
fosse uma entrada do usuário, eles podem adicionar alguma string que pode se comportar como alguma expressão regular diferente...
Além disso, aqui está uma ótima ferramenta para testar e ver explicações de várias expressões regulares Regex101
Para combinar ambos os conjuntos de funcionalidades em uma única função polivalente (inclusive com sensibilidade a maiúsculas e minúsculas selecionáveis), você poderia usar algo como isto:
function FindString($needle,$haystack,$i,$word)
{ // $i should be "" or "i" for case insensitive
if (strtoupper($word)=="W")
{ // if $word is "W" then word search instead of string in string search.
if (preg_match("/\b{$needle}\b/{$i}", $haystack))
{
return true;
}
}
else
{
if(preg_match("/{$needle}/{$i}", $haystack))
{
return true;
}
}
return false;
// Put quotes around true and false above to return them as strings instead of as bools/ints.
}
<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);
// Note our use of ===. Simply, == would not work as expected
// because the position of 'a' was the 0th (first) character.
if ($pos === false) {
echo "The string '$findme' was not found in the string '$mystring'.";
}
else {
echo "The string '$findme' was found in the string '$mystring',";
echo " and exists at position $pos.";
}
?>