PHP filter_var () - FILTER_VALIDATE_URL - PullRequest
       6

PHP filter_var () - FILTER_VALIDATE_URL

6 голосов
/ 26 января 2010

Фильтр FILTER_VALIDATE_URL, похоже, испытывает некоторые проблемы при проверке не-ASCII-URL:

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 проверочного фильтра.

Ответы [ 3 ]

39 голосов
/ 01 апреля 2010

Технически это недопустимый URL-адрес в соответствии с разделом 5 RFC 1738. Браузеры автоматически кодируют символ ã в% C3% A3 перед отправкой запроса на сервер. Технически действительный полный URL здесь: http://pt.wikipedia.org/wiki/Guimar%C3%A3es Передайте это в фильтр VALIDATE_URL, и он будет работать нормально. Фильтр проверяет только в соответствии со спецификацией, он не пытается исправить / кодировать символы для вас.

4 голосов
/ 26 января 2010

Разбор начинается здесь:
http://svn.php.net/viewvc/php/php-src/trunk/ext/filter/logical_filters.c?view=markup

и фактически выполняется в /trunk/ext/standard/url.c

На первый взгляд я не вижу ничего, что намеренно отклоняет символы не ASCII, так что, вероятно, это просто отсутствие поддержки юникода. PHP никуда не годится для обработки не-ASCII символов. (

2 голосов
/ 02 мая 2017

Следующий код использует 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://somedomain.com/some/path/file1.jpg")) {
    echo "NOT A URL";
}
else {
    echo "IS A URL";
}
...