Проверка URL - Принимает URL без протоколов - PullRequest
5 голосов
/ 03 августа 2010

У меня есть базовая проверка URL в моей заявке.Сейчас я использую следующий код.

//validates whether the given value is 
//a valid URL
function validateUrl(value)
{
    var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
    return regexp.test(value);
}

Но сейчас он не принимает URL-адреса без протокола.Напримересли я предоставляю www.google.com, он не принимает его.Как я могу изменить RegEx, чтобы он принимал URL без протокола?

Ответы [ 5 ]

5 голосов
/ 07 августа 2010

Вот большое длинное регулярное выражение для сопоставления URL:

(?i)\b((?:(?:[a-z][\w-]+:)?(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))

Расширенная версия этого (чтобы сделать его понятным):

(?xi)
\b
(                           # Capture 1: entire matched URL
  (?:
    (?:[a-z][\w-]+:)?                # URL protocol and colon
    (?:
      /{1,3}                        # 1-3 slashes
      |                             #   or
      [a-z0-9%]                     # Single letter or digit or '%'
                                    # (Trying not to match e.g. "URI::Escape")
    )
    |                           #   or
    www\d{0,3}[.]               # "www.", "www1.", "www2." … "www999."
    |                           #   or
    [a-z0-9.\-]+[.][a-z]{2,4}/  # looks like domain name followed by a slash
  )
  (?:                           # One or more:
    [^\s()<>]+                      # Run of non-space, non-()<>
    |                               #   or
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\)  # balanced parens, up to 2 levels
  )+
  (?:                           # End with:
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\)  # balanced parens, up to 2 levels
    |                                   #   or
    [^\s`!()\[\]{};:'".,<>?«»“”‘’]        # not a space or one of these punct chars
  )
)

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

1 голос
/ 03 августа 2010

Измените регулярное выражение на:

/((ftp|http|https):\/\/)?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
1 голос
/ 03 августа 2010

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

function validateUrl(value)
{
    var regexp = /((ftp|http|https):\/\/)?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
    return regexp.test(value);
} 
1 голос
/ 03 августа 2010

Сделать протокол необязательным с (...)?

/(((ftp|http|https):\/\/)|(\/\/))?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
0 голосов
/ 03 августа 2010

Измените первую часть на:

(?:(ftp|http|https):)?(?:\/\/)?

(?: ... ) сгруппирует содержимое без использования групп захвата (поэтому фактический протокол остается в первой группе).

Обратите внимание, как отдельные части protocol: и // являются необязательными, поскольку //www.google.com является действительным (относительным) URL.

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