Является ли регулярное выражение хорошим способом проверить URL-адрес

Я пытаюсь проверить правильность URL-адреса, введенного с помощью php5. Я думал об использовании регулярного выражения, но предполагая, что оно все время работает правильно, оно решает только проблему синтаксической корректности URL-адреса. Это ничего не говорит мне о том, что URL-адрес правильный или работает.

Я пытаюсь найти другое решение, чтобы сделать и то, и другое, если это возможно. Или лучше найти 2 отдельных решения для этого?

Если регулярное выражение — это путь, какие проверенные регулярные выражения существуют для URL-адресов?


person Berming    schedule 04.08.2010    source источник
comment
даже проверка того, существует ли URL-адрес сейчас, не означает, что он будет существовать, когда вы захотите отобразить/использовать его позже.   -  person scunliffe    schedule 04.08.2010
comment
Почему вы проверяете, действителен ли URL-адрес? Как правило, как веб-разработчик, разве вы не знаете заранее, что URL-адрес действителен? В большинстве CMS или других системах действительными URL-адресами являются либо файлы, либо записи базы данных, но проверка этого полностью зависит от вашей настройки. Некоторая дополнительная информация поможет вам ответить, конкретно о вашем затруднительном положении.   -  person Owen Allen    schedule 04.08.2010
comment
Возможно, это слишком мягко для того, что вы хотите сделать, но взгляните на php. net/manual/en/function.parse-url.php   -  person Pekka    schedule 04.08.2010
comment
У вас будут только URL-адреса HTTP для проверки?   -  person Gordon    schedule 05.08.2010


Ответы (8)


Вместо того, чтобы ломать голову над регулярным выражением (URL-адреса очень сложны), я просто использую filter_var(), а затем попытайтесь пропинговать URL-адрес, используя cURL:

if (filter_var($url, FILTER_VALIDATE_URL) !== false)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_exec($ch);
    $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($status_code >= 200 && $status_code < 400)
    {
        echo 'URL is valid!';
    }
}
person BoltClock    schedule 04.08.2010
comment
Если я не ошибаюсь, пинг проверяет только существование домена, а не доступность полного URL-адреса. - person Marcel Korpel; 04.08.2010
comment
@Marcel Korpel: хорошая мысль. Отредактировал мой ответ, чтобы вместо этого использовать cURL, что должно быть более жизнеспособным. - person BoltClock; 04.08.2010
comment
Я бы также добавил туда метод HEAD. Кто-то может указать вам на файл размером 1 ГБ, и ваш сервер с радостью загрузит его в противном случае. Кроме того, нехорошо загружать что-то, если вы хотите только проверить, существует ли оно - для этого и нужен HEAD. - person Daniel Kluev; 04.08.2010
comment
@Daniel Kluev: тоже хороший момент, теперь добавлены соответствующие параметры. - person BoltClock; 04.08.2010
comment
оберните его в функцию, таким образом вы сможете его заклеймить. - person Timo Huovinen; 04.08.2010
comment
@Daniel не все серверы дадут HEAD. - person Gordon; 05.08.2010
comment
@ Гордон +1 за формулировку, но я еще не видел такого сервера. RFC специально говорит, что этот метод часто используется для проверки гипертекстовых ссылок на достоверность... - person Artefacto; 05.08.2010
comment
Перенаправления HTTP не обязательно означают, что URL-адреса недействительны. - person bcosca; 05.08.2010
comment
@stillstanding: я исправил свой ответ. - person BoltClock; 05.08.2010
comment
@Artefacto Согласен, просто упомянул, что это может привести к ложным результатам, если какой-то администратор отключит его. - person Gordon; 05.08.2010

Для проверки http://www.php.net/manual/en/filter.filters.validate.php

Чтобы проверить, существует ли он... ну, вам нужно попытаться получить к нему доступ на самом деле.

person Mchl    schedule 04.08.2010

Чтобы проверить, является ли URL-адрес «правильным или рабочим», вам нужно будет попробовать взаимодействовать с ним (например, как это делает веб-браузер).

Я бы порекомендовал HTTP-библиотеку для Perl, например LWP. ::Просто сделать это.

person brabster    schedule 04.08.2010
comment
Поэтому я должен разбить его на 2 задачи. - person Berming; 04.08.2010
comment
Абсолютно. Вы задаете два совершенно разных вопроса, например: является ли google.com действительным URL-адресом HTTP? ...и... могу ли я прямо сейчас получить по сети HTTP-ресурс, определенный google.com? Еще один пример того, как различаются вопросы — ответ на первый вопрос будет одинаковым с течением времени, ответ на второй меняется, если ваша сеть выходит из строя. - person brabster; 04.08.2010

RegExLib — хорошее место для выражений Reg Ex

http://www.regexlib.com/Search.aspx?k=URL

person Conrad Frix    schedule 04.08.2010

Что бы я сделал:

  1. Убедитесь, что URL-адрес действителен, используя очень открытое регулярное выражение или filer_var с FILTER_VALIDATE_URL.
  2. Сделайте file_get_contents в URL-адресе и убедитесь, что $http_response_header[0] содержит HTTP-ответ 200.

Теперь, это грязно, конечно, есть более элегантная версия, использующая завиток и прочее.

person NikiC    schedule 04.08.2010
comment
вы можете просто использовать get_headers - person Gordon; 05.08.2010
comment
Спасибо, не знал об этой функции. PHP полон сюрпризов ;) - person NikiC; 05.08.2010


я бы использовал регулярное выражение, чтобы решить эту проблему, и я ненавижу регулярное выражение. Однако этот инструмент делает мою жизнь намного проще... проверьте его >> http://gskinner.com/RegExr/

person lando    schedule 05.08.2010

Пинговать URL-адрес, чтобы проверить, является ли он действительным URL-адресом, — это нонсенс!

  • Что делать, если хост не работает?
  • Что делать, если домен не пингуется?

Если вы действительно хотите провести «живое» тестирование, попробуйте разрешить URL-адрес с помощью DSN. DNS более надежен, чем PING или HTTP.

<?php
$ip = gethostbyname('www.example.com');

echo $ip;
?>

Но даже если это не удается, URL-адрес может быть действительным. У него просто нет записи DNS. Так что это зависит от ваших потребностей.

person resmo    schedule 05.08.2010