PHP регулярное выражение для проверки URL - PullRequest
4 голосов
/ 06 марта 2010

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

Я искал в Интернете, но не могу найти ничего, что, как я уверен, будет надежным, и все, что я могу найти на 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);
    }

Ответы [ 4 ]

2 голосов
/ 06 марта 2010

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

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

Например: example.ay НЕ является допустимым доменом, поскольку домен .ay TLD недействителен.Но с использованием регулярного выражения, размещенного здесь ([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) проходили валидацию.

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

1 голос
/ 06 марта 2010

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

^(?#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|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$
1 голос
/ 06 марта 2010

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

Возможно, вам лучше проанализировать URL с помощью <a href="http://php.net/parse_url" rel="nofollow noreferrer">parse_url</a>, а затем проверить, все ли требуемые биты в порядке.

Дополнительно: Это фрагмент моего класса 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, а именно, что схема установлена ​​и имя хоста содержит точку.

0 голосов
/ 06 марта 2010
!(https?://)?([-_a-z0-9]+\.)*([-_a-z0-9]+)\.([a-z]{2,4})(/?)(.*)!i

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

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