Comportamento estranho de strpos
Pergunta
Este é o meu código:
<?php
$url = "http://www.uhasselt.be/collegeroosters/2009_2010_298_5_10.html";
$headers = get_headers($url, 1);
print_r($headers);
$contloc = $headers["Content-Location"];
echo "Content-Location: " . $contloc . "\n";
$soft404test = strpos($contloc, "http://www.uhasselt.be/404b.htm") ? true : false;
var_dump($soft404test);
?>
Esta é a sua saída:
Array
(
[0] => HTTP/1.1 200 OK
[Content-Length] => 2030
[Content-Type] => text/html
[Content-Location] => http://www.uhasselt.be/404b.htm?404;http://www.uhasselt.be:80/collegeroosters/2009_2010_298_5_10.html
[Last-Modified] => Mon, 22 Aug 2005 07:10:22 GMT
[Accept-Ranges] => bytes
[ETag] => "88a8b68fe8a6c51:31c9e"
[Server] => Microsoft-IIS/6.0
[MicrosoftOfficeWebServer] => 5.0_Pub
[X-Powered-By] => ASP.NET
[Date] => Tue, 24 Nov 2009 08:40:25 GMT
[Connection] => close
)
Content-Location: http://www.uhasselt.be/404b.htm?404;http://www.uhasselt.be:80/collegeroosters/2009_2010_298_5_10.html
bool(false)
Esse comportamento é inesperado. O que eu pensei que estava fazendo é detectar o Soft 404, olhando o atributo de localização de conteúdo nos meus cabeçalhos HTTP. A função STRPOS toma decisões que não tomo. Onde foi que eu errei? (Eu não preciso que isso funcione em outros sites, a propósito.)
Solução
strpos()
pode retornar false se a string não for encontrada ou 0 se a string for encontrada no início. No entanto, 0 avalia o FALSE em uma verificação booleana, então você precisa verificar explicitamente o tipo:
$soft404test = strpos($contloc, "http://www.uhasselt.be/404b.htm") !== false;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow