Каков наилучший способ извлечь часть URL-адреса с помощью регулярного выражения? - PullRequest
0 голосов
/ 06 февраля 2009

Я извлекаю хост из моего URL, и я застрял, делая последний / необязательный. регулярное выражение должно быть готово получить следующее:

http://a.b.com:8080/some/path/file.txt
or
ftp://a.b.com:8080/some/path
or
ftp://user@a.b.com/some/path
or
http://a.b.com
or 
a.b.com/some/path

and return a.b.com

так ...

(ftp://|http://)? optionally matches the first part
then it gets hairy...
so... without adding ugly (and wrong) regexp here... just in english
(everything that isn't an '@') //optional
(everything that isn't a '/' up to the first '/' IF it's there) //this is the host group that I want
(everything else that trails) //optional

Ответы [ 3 ]

5 голосов
/ 06 февраля 2009

Вам нужно использовать регулярное выражение? Большинство языков поддерживают парсинг URL. Например, Java имеет свой java.net.URL, Python имеет свой модуль urlparse, а Ruby имеет свой модуль URI. Вы можете использовать их для запроса различных частей данного URL.

2 голосов
/ 06 февраля 2009

Ответ Джереми Рутена близок, но не удастся, если после имени хоста появится @. Я бы предложил:

(все, что не является '@') // необязательно

(?: [^ @: /] * @)

Двоеточие и косая черта препятствуют сопоставлению за доменом, если после домена появляется @. Обратите внимание на не захватывание паренов.

(все, что не является '/' до первого '/' ЕСЛИ оно там) // это группа хостов, которую я хочу

([^: /] +)

Обратите внимание на захват парней.

(все остальное, что тянется) // необязательно

Поскольку парены заключают в себе имя хоста и только имя хоста, нет необходимости продолжать сопоставление.

Итак, сложив все вместе, вы получите:

/ ^ (?:? FTP | HTTPS): // (?: [^ @: /] * @) ([^: /] +) /

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

0 голосов
/ 06 февраля 2009

Я проверял это на PHP, и он работает на всех ваших примерах:

/^(ftp:\/\/|https?:\/\/)?(.+@)?([a-zA-Z0-9\.\-]+).*$/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...