2011-12-16 1 views
0

Я бы хотел использовать RegEx для анализа корневого домена заданного URL-адреса ввода. Я уже знаю, что там нет RegEx, который не может быть «сломан» с учетом соответствующего URL-адреса ввода, поэтому я хотел бы ограничить использование данного RegEx в списке данных TLD (если это возможно). Вот пример:Исследуйте корневой домен с помощью RegEx и предопределенного списка TLD

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

www.google.co.uk 
www.google.co.uk/something 
www.google.com/ 
www.google.com/something 
google.com/ 
google.com/something 
subdomain.google.com/ 
subdomain.google.com/something 
www.subdomain.google.com/ 
www.google.net/ 
www.google.net/something 
google.net/ 

Конечный результат должен быть таким:

google.co.uk 
google.co.uk 
google.com 
google.com 
google.com 
google.com 
google.com 
google.com 
google.com 
google.com 
google.com 
google.com 

Главное, я хотел бы, хотя, для регулярных выражений для синтаксического анализа на основе следующих:

Найти ДВУ в данном URL из списка заданных доменов верхнего уровня (например:

(co.uk|com|net|edu|gov|etc|etc|etc) 

Если один из данного TL D's найден ТОГДА матч & разобрать все слева от (и в том числе), что TLD, который он нашел, UP до тех пор, пока он не достигнет начала линии ИЛИ не достигнет другого ».

Если можно написать регулярное выражение, которое соответствует на основе приведенного описания «псевдокода», оно должно анализировать входные данные образца в точности так, как показано.

+0

Какие рамки вы используете? Многие из них создали инструменты для работы с URL-адресами. –

+0

Для всех целей и целей достаточно сказать, что я застрял с использованием чистого регулярного выражения. Представьте, что вам нужно было использовать PHP preg_match вместе с регулярным выражением, чтобы делать то, что я описал выше, и вы о том, где я нахожусь. – Learning

ответ

1

В Java:

package test; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Test { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     String subject = "www.google.co.uk\nwww.google.co.uk/something\nwww.google.com/\nwww.google.com/something\ngoogle.com/\ngoogle.com/something\nsubdomain.google.com/\nsubdomain.google.com/something\nwww.subdomain.google.com/\nwww.google.net/\nwww.google.net/something\ngoogle.net/\n"; 
     Pattern pattern = Pattern.compile("(\\w+)\\.(co.uk|com|net|edu|gov)"); 

     Matcher m = pattern.matcher(subject); 
     int count = 0; 
      while(m.find()) { 
       count++; 
       System.out.println(m.group()); 
      } 
    } 
} 

Regex = (\w+)\.(co.uk|com|net|edu|gov)

2
perl -ne 'print $2, "\n" if m-^([^/]+?\.|)([^./]*\.(co\.uk|com|net|edu|gov|etc|etc|etc))(/.*|)$-' /tmp/x.txt 

, кажется, дает результаты, которые вы ищете, по крайней мере, на данных выборки вы предоставили (если вы не хотите, чтобы перевести google.net на google.com).

Обратите внимание, что я немного ленился с моим [^. /], Который может соответствовать символам, которые не являются законными в именах доменов. Опять же, i18n, вероятно, переписал правила для DNS, чтобы включить намного больше символов, чем когда я был молод.

0

На самом деле нет никакого способа, чтобы разобрать URI с помощью регулярных выражений по многим причинам. Например, действительны все localhost, 192.168.0.43, www.google.co.uk.

Однако, если вы извлекаете последний элемент перед «.», Вы не хотите, чтобы «43» с вашего IP-адреса являлся TLD, существует множество исключений (у co.uk и bl.uk есть два разных поведения).

Я написал C библиотека/Python привязки и инструмент командной строки, доступны там: http://www.github.com/stricaud/faup, так что вы можете сделать такие вещи, как:

$ faup -p www.example.com 
scheme,credential,subdomain,domain,host,tld,port,resource_path,query_string,fragment 
,,www,example.com,www.example.com,com,,,, 

Чтобы получить домен, вы можете иметь файл со всеми из них, и запустить его через faup:

$ cat urls.txt |faup -f domain 
google.co.uk 
google.co.uk 
google.com 
google.com 
google.com 
google.com 
google.com 
google.com 
google.com 
google.net 
google.net 
google.net 

, если вы просто хотите TLD, вы можете использовать параметр -f TLD, такие как:

$ faup -f tld www.example.com 
com 

Или даже получить выход JSon:

$ faup -o json http://www.test.co.uk/index.html?foo=bar#tagada 
{ 
    "scheme": "http", 
    "credential": "", 
    "subdomain": "www", 
    "domain": "test.co.uk", 
    "host": "www.test.co.uk", 
    "tld": "co.uk", 
    "port": "", 
    "resource_path": "/index.html", 
    "query_string": "?foo=bar", 
    "fragment": "#tagada" 
} 

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