Регулярное выражение PHP для проверки URL-адреса

Я ищу подходящее регулярное выражение для соответствия URL-адресу (полный URL-адрес с помощью схемы, домена, пути и т. Д.). Я бы обычно использовал filter_var, но в этом случае я не могу, поскольку мне нужно поддерживать PHP <5.2!

Я искал в Интернете, но не могу найти ничего, что, я уверен, будет безупречным, и все, что я могу найти на SO, – это люди, которые говорят, что используют filter_var.

У кого-нибудь есть регулярное выражение, которое они используют для этого?

Мой код (просто чтобы вы могли видеть, чего я пытаюсь достичь):

function validate_url($url){ if (function_exists('filter_var')){ return filter_var($url, FILTER_VALIDATE_URL); } return preg_match(REGEX_HERE, $url); } 

Вы можете попробовать это . Я сам не пробовал, но это, безусловно, самое большое регулярное выражение, которое я когда-либо видел, ха-ха.

 ^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[az]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[af\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[af\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[af\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[af\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[af\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[af\d]{2})*)?$ 

Я создал решение для проверки домена. Хотя он не охватывает весь URL целиком, он очень подробный и конкретный. Вопрос, который вам нужно задать самому себе: «Почему я проверяю домен?» Если нужно убедиться, что домен действительно существует, вам необходимо подтвердить домен (включая действительные TLD). Проблема в том, что слишком много разработчиков берут ярлык ([az] {2,4}) и называют это хорошим. Если вы думаете по этим строкам, то зачем называть его проверкой URL? Это не. Это просто передача URL через регулярное выражение.

У меня есть класс с открытым исходным кодом, который позволит вам проверять домен не только с использованием единого источника для управления TLD (iana.org), но также будет проверять домен через записи DNS, чтобы убедиться, что он действительно существует. Проверка DNS является необязательной, но домен будет действовать в соответствии с TLD.

Например: example.ay НЕ является допустимым доменом, так как TLD .ay недействителен. Но используя регулярное выражение, размещенное здесь ([az] {2,4}), оно пройдет. У меня есть близость к качеству. Я пытаюсь выразить это в коде, который пишу. Другие могут не беспокоиться. Поэтому, если вы хотите просто «проверить» URL-адрес, вы можете использовать примеры, перечисленные в этих ответах. Если вы действительно хотите проверить домен в URL-адресе, вы можете иметь в классе, который я создал, чтобы сделать именно это. Его можно загрузить по адресу: http://code.google.com/p/blogchuck/source/browse/trunk/domains.php

Он проверяет на основе RFC, которые «управляют» (используя термин «свободно»), что определяет действительный домен. Вкратце, вот что класс доменов будет делать: Основные правила проверки домена

  • должен иметь длину не менее одного символа
  • должен начинаться с буквы или цифры
  • содержит буквы, цифры и дефисы
  • должен заканчиваться буквой или номером
  • может содержать несколько узлов (например, node1.node2.node3)
  • каждый узел может иметь длину до 63 символов максимум
  • полное имя домена может быть не более 255 символов
  • должен заканчиваться действительным TLD
  • может быть адресом IP4

Он также загрузит копию основного файла TLD iana.org только после проверки вашей локальной копии. Если ваша локальная копия устарела на 30 дней, она загрузит новую копию. TLD в файле будут использоваться в REGEX для проверки TLD в домене, который вы проверяете. Это предотвращает прохождение валидации .ay (и других недопустимых TLD).

Это длинный бит кода, но очень компактный, учитывая то, что он делает. И это самое точное. Вот почему я задал вопрос раньше. Вы хотите сделать «проверку» или просто «проверку»?

Я видел регулярное выражение, которое могло бы действительно проверять любой допустимый URL, но это было две страницы долго …

Вероятно, вам лучше parse_url URL-адрес с помощью parse_url а затем проверить, все ли ваши необходимые биты в порядке.

Дополнение: это отладка моего класса URL:

 public static function IsUrl($test) { if (strpos($test, ' ') > -1) { return false; } if (strpos($test, '.') > 1) { $check = @parse_url($test); return is_array($check) && isset($check['scheme']) && isset($check['host']) && count(explode('.', $check['host'])) > 1 } return false; } 

Он тестирует данную строку и требует некоторых основ в URL-адресе, а именно, что эта схема установлена, а имя хоста имеет точку в ней.

 !(https?://)?([-_a-z0-9]+\.)*([-_a-z0-9]+)\.([az]{2,4})(/?)(.*)!i 

Я использую это регулярное выражение для проверки URL-адресов. Пока это не подвело меня ни разу 🙂