O assunto a falarmos aqui é bem básico, mas confunde muita gente, principalmente os iniciantes no PHP.
Você pode recaptular o funcionamento da função strpos lendo .
Todos sabemos que a função strpos do PHP serve para nos informar qual a posição numérica de determinado caractere ou string dentro de outra string. A confusão mesmo acontece quando tratamos o retorno dessa função.
A função strpos retorna o número da posição do texto em que a string procurada é encontrada, e a numeração de posições inicia-se em zero; caso não seja encontrada, FALSE é retornado.
Até aqui tudo bem, nada demais. Porém veremos o que acontece se executarmos uma das seguintes instruções de exemplo:
<?php $stringBase = 'Ser Programador te ajuda a obter sucesso!'; $stringPesquisa = 'Ser Programador'; $posicao = strpos($stringBase, $stringPesquisa); if ($posicao) { echo $stringPesquisa . ' foi encontrado na string'; } else { echo $stringPesquisa . ' NÃO foi encontrado na string'; }
<?php $stringBase = 'Ser Programador te ajuda a obter sucesso!'; $stringPesquisa = 'Ser Programador'; $posicao = strpos($stringBase, $stringPesquisa); if ($posicao == FALSE) { echo $stringPesquisa . ' NÃO foi encontrado na string'; } else { echo $stringPesquisa . ' foi encontrado na string'; }
Os exemplos acima irão apresentar que a string pesquisada NÃO foi encontrada, mesmo ela existindo.
Por que isso acontece?
A primeira impressão pode ser de que o PHP tem um bug, mas este comportamento está completamente correto. A questão aqui é que a string pesquisada existe na primeira posição, logo a função strpos retornará zero.
O IF apenas compara o resultado de expressões, ou seja, somente trabalha com TRUE ou FALSE. Ao fornecer zero para o IF, que é um retorno positivo esperado da função strpos, o zero será interpretado como FALSE e irá entregar um resultado que não é esperado.
Para resolver o problema basta usarmos no IF um comparador que verifica o valor e o tipo do dado. Este verificador é o "===" (três iguais).
Ao executar a seguinte instrução:
<?php var_dump(0 === FALSE);
O retorno será:
bool(false)
Isso acontece porque apesar de zero e FALSE serem teoricamente a mesma coisa, eles não são do mesmo tipo.
Tendo isso em mente, podemos modificar o script:
<?php $stringBase = 'Ser Programador te ajuda a obter sucesso!'; $stringPesquisa = 'Ser Programador'; $posicao = strpos($stringBase, $stringPesquisa); if ($posicao === FALSE) { echo $stringPesquisa . ' NÃO foi encontrado na string'; } else { echo $stringPesquisa . ' foi encontrado na string'; }
Dessa forma, se o valor retornado pela função e armazenado na variável $posicao for igual e do mesmo tipo que FALSE, apresenta a mensagem negativa.
Podemos também utilizar o sinal "!==", que é o inverso de "===". Vejamos:
<?php $stringBase = 'Ser Programador te ajuda a obter sucesso!'; $stringPesquisa = 'Ser Programador'; $posicao = strpos($stringBase, $stringPesquisa); if ($posicao !== FALSE) { echo $stringPesquisa . ' foi encontrado na string'; } else { echo $stringPesquisa . ' NÃO foi encontrado na string'; }
Ao utiliza-lo (sinal "!=="), estamos literalmente verificando se os valores NÃO são iguais ou NÃO são do mesmo tipo.