2012-12-20 8 views
5

Google+ sembra utilizzare The-King-of-URL-Regexes per analizzare i polloni dai post degli utenti. Non richiede protocolli e fa bene a ignorare la punteggiatura. Ad esempio: se pubblico "Mi piace plus.google.com", il sito lo trasformerà in "Mi piace plus.google.com". Quindi, se qualcuno conosce una regex che può analizzare gli URL sia con che senza protocolli ed è bravo a ignorare la punteggiatura, ti preghiamo di rispondere con questo.In che modo Google+ analizza gli URL dai post?

Non credo che questa domanda sia un problema, perché tutte le risposte che ho visto a domande simili sembrano richiedere un protocollo nell'URL.

Grazie

+1

questo blog ha quello che ti serve penso. http://blog.mattheworiordan.com/post/13174566389/url-regolare-expression-per-links-with-or-with-the – zer0bit

+1

@ zer0bit si presenta come nel link che hai fornito potrebbe non corrispondere all'url plus .google.com – cheesemacfly

+3

questo è un problema ... ma qui è un buon punto di partenza. http://mathiasbynens.be/demo/url-regex – zer0bit

risposta

1

una strategia ragionevole potrebbe essere quella di utilizzare un'espressione regolare per abbinare domini di primo livello (TLD) preceduto da un punto, e quindi eseguire una tabella di ricerca noto host o query DNS come una fase di verifica sulla sospetta stringa hostname.

ad es. ecco una sessione utilizzando Perl che dimostrano la prima parte della strategia:

$ 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

L'obiettivo finale è quello di colpire il sito e recuperare i metadati, quindi si verificherà un passaggio di verifica del target. Tuttavia, vorrei che venissero rilevati tutti gli URL validi; incluse le barre, le stringhe di query e tutte le altre chicche che gli URL tendono a contenere. – JoshNaro

2

Ecco un più completo (URL completo) attuazione. Si noti che non è pienamente conforme allo standard RFC 3986, manca alcuni TLD, consente alcuni TLD di Paesi illegali, consente di rilasciare la parte del protocollo (come richiesto nella Q originale) e presenta alcune altre imperfezioni. Il vantaggio è che ha un sacco di semplicità ed è molto più breve di molte altre implementazioni e fa> il 95% del lavoro.

#!/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

Sembra a me che la seguente riga:

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

dovrebbe essere risolto in questo modo:

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

In caso contrario, l'ingresso http://www.google.com viene analizzato come

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