Соответствие имени хоста в строке, когда у него нет протокола: //? - PullRequest
0 голосов
/ 19 октября 2011

Я использую этот код js для сопоставления имени хоста из строки:

url.match(/:\/\/(www\.)?(.[^/:]+)/);

Это работает, когда URL имеет протокол: // в начале.Например:

Это прекрасно работает:

var url = "http://domain.com/page";
url.match(/:\/\/(www\.)?(.[^/:]+)/);

Но это не так:

var url = "domain.com/page";
url.match(/:\/\/(www\.)?(.[^/:]+)/);

Я пробовал:

url.match(/(:\/\/)?(www\.)?(.[^/:]+)/);

И это прекрасно соответствует имени хоста, когда оно не содержит протокола: //, но когда оно действительно содержит его, оно возвращает только протокол, а не имя хоста.

Как я могу сопоставить домен, когда ононе содержит?

Ответы [ 4 ]

4 голосов
/ 19 октября 2011

Я использовал эту функцию от Стивена Левитана, она довольно прилично разбирает URL.

Вот как вы используете эту функцию

  alert(parseUri("www.domain.com/foo").host)
1 голос
/ 19 октября 2011

Хорошо, пока у вас не произошел обвал мозга от @xanatos, ответьте здесь - простое регулярное выражение для основных нужд.Другие ответы являются более полными и обрабатывают больше случаев, чем это регулярное выражение:

(?:(?:(?:\bhttps?|ftp)://)|^)([-A-Z0-9.]+)/

Группа 1 будет иметь ваше имя хоста.Парсинг URL - хрупкая вещь, связанная с регулярными выражениями.Вы были на правильном пути.У вас было два регулярных выражения, которые работали частично.Я просто объединил их.

Редактировать: я устал вчера вечером.Вот регулярное выражение для jscript

if (subject.match(/(?:(?:(?:\bhttps?|ftp):\/\/)|^)([\-a-z0-9.]+)\//i)) {
    // Successful match
} else {
    // Match attempt failed
}
1 голос
/ 19 октября 2011

Это

var rx = /^(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?:\w+:\w+@)?(?:(?:[-\w]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?::[\d]{1,5})?(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$/;

должно быть регулярным выражением uber-url :-), взятое отсюда http://flanders.co.nz/2009/11/08/a-good-url-regular-expression-repost/

Тест здесь: http://jsfiddle.net/Qznzx/1/

Показывает бесполезность регулярных выражений.

0 голосов
/ 19 октября 2011

Это может быть немного сложнее, чем необходимо, но, похоже, работает:

^((?:.+?:\/\/)?(?:.[^/:]+)+)$ 
  1. Группа без захвата для протокола. С самого начала строки сопоставлять любое количество символов до :. Там может быть ноль или один протокол.
  2. Группа без захвата для остальной части URL. Эта часть должна существовать.
  3. Сгруппируйте все это в одну группу.
...