PHP filter_var () – FILTER_VALIDATE_URL

Фильтр 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"; }