2010-08-04 3 views
5

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

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

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

+2

даже тестирование, если url существует «сейчас», не означает, что он будет существовать «когда» вы хотите сделать/использовать его позже. – scunliffe

+2

Почему вы проверяете, действителен ли URL? Как правило, как веб-разработчик, разве вы не знаете заранее, что URL-адрес действителен? В большинстве CMS или других систем действительными URL-адресами являются либо файлы, либо записи в базе данных, но проверка этого будет полностью зависеть от вашей настройки. Некоторая дополнительная информация поможет в ответе на конкретный вопрос. –

+2

@Owen, адрес пользователя – Berming

ответ

11

Вместо растрескивание голову над регулярным выражением (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!'; 
    } 
} 
+0

Если я не ошибаюсь, pinging проверяет, существует ли домен, а не полный URL-адрес. –

+0

@ Марсель Корпель: хорошая точка. Отредактировал мой ответ, чтобы использовать cURL вместо этого, что должно быть более жизнеспособным. – BoltClock

+6

Я бы также добавил метод HEAD. Кто-то может указать вам на файл размером 1 ГБ, и ваш сервер будет с радостью загружать его в противном случае. Кроме того, его не очень удобно скачивать, если вы только хотите проверить, существует ли это - для чего предназначен HEAD. –

2

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

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

+0

Итак, я должен разбить его на 2 задачи. – Berming

+0

Абсолютно. Вы задаете два совершенно разных вопроса, например: http://google.com - действительный URL-адрес HTTP? ... и ... могу ли я HTTP GET ресурс, определенный http://google.com через сеть прямо сейчас? Еще один пример того, как различаются вопросы: ответ на первый вопрос будет одинаковым с течением времени, ответ на второй изменяется, если ваша сеть опустится. – Brabster

1

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

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

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

+1

вы могли бы просто использовать ['get_headers'] (http://www.php.net/manual/en/function.get-headers.php) – Gordon

+0

Спасибо, не знали эту функцию. PHP полна сюрпризов;) – NikiC

1

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

1

Отправлять URL-адрес, чтобы увидеть, является ли он действительным URL-адресом, является бессмыслицей!

  • Что делать, если хост не работает?
  • Что делать, если домен не поддерживает ping?

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

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

echo $ip; 
?> 

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

Смежные вопросы