Можно ли использовать регулярное выражение для извлечения домена из URL? - PullRequest
2 голосов
/ 21 июля 2010

Предположим, я хочу превратить это:

http://en.wikipedia.org/wiki/Anarchy

в это:

en.wikipedia.org

или даже лучше, это:

wikipedia.org

Возможно ли это вообще?в регулярных выражениях?

Ответы [ 4 ]

9 голосов
/ 21 июля 2010

Зачем использовать регулярное выражение, если в Ruby есть библиотека для него? Библиотека URI :

ruby-1.9.1-p378 > require 'uri'
 => true 
ruby-1.9.1-p378 > uri = URI.parse("http://en.wikipedia.org/wiki/Anarchy")
 => #<URI::HTTP:0x000001010a2270 URL:http://en.wikipedia.org/wiki/Anarchy> 
ruby-1.9.1-p378 > uri.host
 => "en.wikipedia.org" 
ruby-1.9.1-p378 > uri.host.split('.')
 => ["en", "wikipedia", "org"] 

Разделение хоста - это один из способов разделения доменов, но я не знаю надежного способа получения базового домена - вы не можете просто сосчитать в случае URL-адреса как "http://somedomain.otherdomain.school.ac.uk" против" www.google.com ".

2 голосов
/ 21 июля 2010

/http:\/\/([^\/]*).*/ создаст en.wikipedia.org из предоставленной вами строки.

/http:\/\/.{0,3}\.([^\/]*).*/ создаст wikipedia.org.

1 голос
/ 21 июля 2010

да

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

Perl:

$url =~ s,http://[a-z]{2}\.(wikipedia\.org)/.*,$1,;

рубин:

url = url.sub(/http:\/\/[a-z]{2}\.(wikipedia\.org)\/.*/, '\1')

PHP: $ url = preg_replace ('| http://[a -z] {2}. (wikipedia.org) /.* |, $ 1', $ url);

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

url = 'wikipedia.org'

но я шучу ...

вы, вероятно, захотите обработать любой URL и вытащить часть домена, и это также должно работать для доменов в разных странах, например: foo.co.uk.

В этом случае я бы использовал решение Марка Рушакова, чтобы получить имя хоста, а затем регулярное выражение для извлечения домена:

domain = host.sub(/^.*\.([^.]+\.[^.]+(\.[a-z]{2})?)$/, '\1')

Надеюсь, это поможет

Кроме того, если вы хотите узнать больше, у меня есть онлайн-регулярное выражение: http://tech.bluesmoon.info/2006/04/beginning-regular-expressions.html

0 голосов
/ 21 июля 2010

Конечно, все, что вам нужно сделать, это поиск по http://(.*)/wiki/Anarchy

В Perl (извините, я не знаю Ruby, но я ожидаю, что он похож)

$ string_to_search = ~ s / http: //// (. ) //. должен дать вам wikipedia.org чтобы избавиться от en, вы можете просто выполнить поиск по http: //// en (. ) //......

Это должно сделать это.

Обновление: если вы не знакомы с Regex, я бы порекомендовал взять книгу Regex, она действительно потрясающая, и мне она нравится: REGEX BOOK, Освоение регулярных выражений, я видел ее на half.com на днях для 14.99, но для пояснения того, что я предложил выше, нужно искать строку http://en,, затем что-нибудь, пока вы не найдете / / все это захвачено в $ 1 (в perl, не уверен, что в ruby ​​то же самое) ), простая печать $ 1 напечатает строку.

Обновление: # 2 извините, звезда в регулярном выражении по какой-то причине не появляется, поэтому, где вы видите. в () и после // просто представьте *, о, и я забыл для en части добавить /. в конце концов, таким образом, вы не получите .wikipedia.org

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