Фильтр FILTER_VALIDATE_URL
похоже, имеет некоторые проблемы с проверкой не-ASCII-адресов:
var_dump(filter_var('http://pt.wikipedia.org/wiki/', FILTER_VALIDATE_URL)); // http://pt.wikipedia.org/wiki/ var_dump(filter_var('http://pt.wikipedia.org/wiki/Guimarães', FILTER_VALIDATE_URL)); // false
Почему последний URL правильно не проверен? И каковы возможные обходные пути? Запуск PHP 5.3.0.
Я также хотел бы знать, где я могу найти исходный код FILTER_VALIDATE_URL
проверки FILTER_VALIDATE_URL
.
Разбор начинается здесь:
http://svn.php.net/viewvc/php/php-src/trunk/ext/filter/logical_filters.c?view=markup
и фактически выполняется в /trunk/ext/standard/url.c
На первый взгляд я не вижу ничего, что намеренно отвергает символы, отличные от ASCII, поэтому, вероятно, это просто отсутствие поддержки юникода. PHP не подходит для обработки символов, отличных от ASCII. 🙁
Технически это не действительный URL-адрес в соответствии с разделом 5 RFC 1738. Браузеры автоматически кодируют символ ã на% C3% A3 перед отправкой запроса на сервер. Технически действительный полный URL-адрес здесь: http://pt.wikipedia.org/wiki/Guimar%C3%A3es Передайте это фильтру VALIDATE_URL, и он будет работать нормально. Фильтр проверяет только по спецификации, он не пытается исправить / закодировать символы для вас.
Следующий код использует filter_var, но кодирует символы не ascii до его вызова. Надеюсь, это поможет кому-то.
<?php function validate_url($url) { $path = parse_url($url, PHP_URL_PATH); $encoded_path = array_map('urlencode', explode('/', $path)); $url = str_replace($path, implode('/', $encoded_path), $url); return filter_var($url, FILTER_VALIDATE_URL) ? true : false; } // example if(!validate_url("http://img.ruphp.com/php/f")) { echo "NOT A URL"; } else { echo "IS A URL"; }