2012-12-20 19 views
5

Google+ wydaje się używać The-King-of-URL-Regexes do parsowania frajerów z postów użytkownika. Nie wymaga protokołów i dobrze zignoruje interpunkcja. Na przykład: jeśli opublikuję wpis "Podoba mi się plus.google.com", witryna zmieni je w "Podoba mi się plus.google.com". Jeśli więc ktoś wie o wyglądzie, który może analizować adresy URL zarówno z protokołami, jak i bez nich, i dobrze ignoruje interpunkcję, prosimy o odpowiedź.Jak Google+ analizuje adresy URL z wpisów?

Nie sądzę, że to pytanie jest oszustwem, ponieważ wszystkie odpowiedzi, które widziałem na podobne pytania, wymagają protokołu w adresie URL.

Dzięki

+1

ten blog ma to, czego potrzebujesz, myślę. http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-lub-na-nie- – zer0bit

+1

@ zer0bit wygląda tak, jak pod podanym linkiem, że nie może być zgodny z adresem URL .google.com – cheesemacfly

+3

to jest trudne ... ale tutaj jest dobre miejsce na rozpoczęcie. http://mathiasbynens.be/demo/url-regex – zer0bit

Odpowiedz

1

rozsądna strategia będzie używać wyrażenia regularnego pasuje górne domen poziomu (TLD) poprzedzone kropka, a następnie uruchomić znane gospodarzowi tabelę przeglądową lub zapytanie DNS jako etap weryfikacji na podejrzenie ciąg nazwy hosta.

np. oto sesja z użyciem perla demonstrującego pierwszą część strategii:

$ cat hostname-detector 
#!/usr/bin/perl -w 
# Add more country/new TLDs for completeness 
my $TLD = '(?:com|net|info|org|gov|edu)'; 
while (<>) { 
    while (/((?:[-\w]+\.)+?$TLD)/g) { 
     print "found hostname: $&\n"; 
    } 
} 


$ ./hostname-detector 
"I like plus.google.com." 
found hostname: plus.google.com 

a sentence without a hostname. 

here's another host: free.org 
found hostname: free.org 

a longer.host.name.psu.edu should work too.      
found hostname: longer.host.name.psu.edu 

a host.with-dashes.gov ... 
found hostname: host.with-dashes.gov 
+0

Ostatecznym celem jest trafienie w witrynę i pobranie metadanych, więc nastąpi etap weryfikacji docelowej. Chciałbym jednak, aby wszystkie prawidłowe adresy URL zostały wykryte; w tym ukośniki do przodu, ciągi zapytań i wszystkie inne gadżety, które zwykle zawierają adresy URL. – JoshNaro

2

Oto bardziej kompletna (pełna URL) implementacja. Zauważ, że nie jest w pełni zgodny z RFC 3986, brakuje niektórych TLD, zezwala na niektóre nielegalne TLD w kraju, pozwala na opuszczenie części protokołu (zgodnie z żądaniem w oryginalnym Q) i ma kilka innych niedoskonałości. Plusem jest to, że ma dużo prostoty i jest znacznie krótszy niż wiele innych wdrożeń i stanowi> 95% pracy.

#!/usr/bin/perl -w 
# URL grammar, not 100% RFC 3986 but pretty good considering the simplicity. 
# For more complete implementation options see: 
# http://mathiasbynens.be/demo/url-regex 
# https://gist.github.com/dperini/729294 
# https://github.com/garycourt/uri-js (RFC 3986 compliant) 
# 
my $Protocol = '(?:https?|ftp)://'; 
# Add more new TLDs for completeness 
my $TLD = '(?:com|net|info|org|gov|edu|[a-z]{2})'; 
my $UserAuth = '(?:[^\s:@]+:[^\[email protected]]*@)'; 
my $HostName = '(?:(?:[-\w]+\.)+?' . ${TLD} . ')'; 
my $Port = '(?::\d+)'; 
my $Pathname = '/[^\s?#&]*'; 
my $Arg = '\w+(?:=[^\s&])*'; 
my $ArgList = "${Arg}(?:\&${Arg})*"; 
my $QueryArgs = '\?' . ${ArgList}; 
my $URL = qr/ 
    (?:${Protocol})? # Optional, not per RFC! 
    ${UserAuth}? 
    ${HostName} 
    ${Port}? 
    (?:${Pathname})? 
    (?:${QueryArgs})? 
/sox; 

while (<>) { 
    while (/($URL)/g) { 
     print "found URL: $&\n"; 
    } 
} 
0

@arielf

Wydaje mi się, że następujący wiersz:

my $HostName = '(?:(?:[-\w]+\.)+?' . ${TLD} . ')'; 

powinna być ustalona w ten sposób:

my $HostName = '(?:(?:[-\w]+\.)+' . ${TLD} . ')'; 

przeciwnym razie wejście http://www.google.com pobiera analizowany jako

found URL: http://www.go 
found URL: ogle.com