Как проверить, является ли данная строка реальным URL в PHP? - PullRequest
1 голос
/ 20 августа 2009

Мне нужно найти лучший способ (с точки зрения производительности), чтобы определить, является ли данная строка URL-адресом.
REGEXP не поможет, так как www.eeeeeeeeeeeeeee.bbbbbbbbbbbbbbbb.com - это допустимое имя URL, но не в любой сети, известной человеку.
Я думаю использовать CURL и посмотреть, получу ли я статус 200 обратно или просто file_get_contents и проанализирую результат.
Есть ли лучший способ?

Ответы [ 5 ]

7 голосов
/ 20 августа 2009

Не извлекайте все содержимое - это может быть огромно. Вместо этого выполните запрос HEAD.

Конечно, сначала можно выполнить некоторую проверку - удалить вещи, которые являются недействительными в качестве URL-адресов, а не просто URL-адреса, которые в настоящее время ничем не обслуживаются. После этого выдача HEAD-запроса почти так же хороша, как и получается. Сказав это, он становится серой областью ... как насчет URL, который возвращает "требуется авторизация"? Это может быть защищенная паролем директория , но если бы вы знали пароль, вы бы тогда вернули бы 404, поскольку сам файл не существует ...

4 голосов
/ 20 августа 2009

В этой статье описано, как выполнить DNS-запрос от php. Это может быть самый быстрый вариант, хотя он не скажет вам ничего, например, если сервер находится в сети, файл найден и т. Д. Но он скажет вам, что URL-адрес зарегистрирован на IP. Вам решать, будет ли это соответствовать вашему определению "действительный"

1 голос
/ 20 августа 2009

Вы не имеете в виду URL, вы имеете в виду доменное имя

0 голосов
/ 20 августа 2009

Я бы настоятельно рекомендовал использовать CURL, но только заголовки без извлечения какого-либо содержимого.

Вот функция, которую я использую, чтобы проверить, является ли данный URL верным и найденным.

function __checkUrl($url)
{
    //First checking with pattern whether it is proper or not
    $pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/';
    if (preg_match($pattern, $url))
    {
        $ch = curl_init();

        // set URL and other appropriate options
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_setopt($ch, CURLOPT_AUTOREFERER, true);
        curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
        curl_setopt($ch, CURLOPT_TIMEOUT, 4);

        // grab URL
        $output = curl_exec($ch);
        // Get response code
        $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

        // Not found?
        if ($response_code == '404') {
            return false;
        } else {
            return $newurl;
        }
    }
    else
    {
        return false;
    }
}

С помощью этой функции я сначала проверяю, действительно ли URL действителен для Regex. После этого завить это. Установив для CURLOPT_FOLLOWLOCATION значение true, мы позаботимся о 301 и аналогичных перенаправлениях, но ограничим число no. перенаправлений на 3. И, наконец, мы возвращаем эффективный URL после всех перенаправлений.

Надеюсь, это поможет.

0 голосов
/ 20 августа 2009
$host != gethostbyname($host)

для проверки хоста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...