2012-12-20 13 views
5

Google+ उपयोगकर्ता पोस्ट के बाहर चूसने वालों को पार्स करने के लिए द किंग ऑफ यूआरएल-रेगेक्स का उपयोग करना प्रतीत होता है। इसे प्रोटोकॉल की आवश्यकता नहीं है और विराम चिह्न को अनदेखा करने के बारे में अच्छा है। उदाहरण के लिए: यदि मैं "मुझे plus.google.com पसंद करता हूं" पोस्ट करता हूं, तो साइट इसे "plus.google.com पसंद करेगी" में बदल जाएगी। तो अगर कोई रेगेक्स के बारे में जानता है जो प्रोटोकॉल के साथ और बिना दोनों यूआरएल को पार्स कर सकता है और विराम चिह्न को अनदेखा करने में अच्छा है, तो कृपया इसके साथ जवाब दें।Google+ पोस्ट से यूआरएल कैसे पार्स करता है?

मुझे नहीं लगता कि यह प्रश्न एक डुप्ली है, क्योंकि मैंने जो प्रश्नों को देखा है, वे सभी यूआरएल में प्रोटोकॉल की आवश्यकता है।

धन्यवाद

+1

इस ब्लॉग में आपको जो चाहिए वह है। http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-or-without- – zer0bit

+1

@ zer0bit आपके द्वारा दिए गए लिंक में दिखता है, यह यूआरएल प्लस से मेल नहीं खा सकता .google.com – cheesemacfly

+3

यह एक मुश्किल है ... लेकिन यहां शुरू करने के लिए एक अच्छी जगह है। http://mathiasbynens.be/demo/url-regex – zer0bit

उत्तर

1

एक उचित रणनीति उच्च स्तरीय डोमेन (TLD) डॉट से पहले मैच के लिए एक regexp उपयोग करने के लिए, और फिर एक ज्ञात मेजबान तालिका देखने या संदिग्ध पर सत्यापन कदम के रूप में DNS क्वेरी चलाने होगा होस्टनाम स्ट्रिंग।

उदा। यहां रणनीति का पहला भाग प्रदर्शित करने वाले पेर्ल का उपयोग करके एक सत्र है:

$ 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

अंतिम लक्ष्य साइट को हिट करना और मेटाडेटा पुनर्प्राप्त करना है, इसलिए एक लक्ष्य सत्यापन चरण होगा। हालांकि, मैं सभी मान्य यूआरएल का पता लगाना चाहता हूं; आगे की स्लैश, क्वेरी स्ट्रिंग, और अन्य सभी उपहारों सहित यूआरएल शामिल हैं। – JoshNaro

2

यहां एक और पूर्ण (पूर्ण URL) कार्यान्वयन है। ध्यान दें कि यह पूरी तरह से आरएफसी 3 9 86 अनुपालन नहीं है, कुछ टीएलडी गायब है, कुछ अवैध देश टीएलडी को प्रोटोकॉल भाग (मूल क्यू में अनुरोध के रूप में) छोड़ने की इजाजत देता है, और इसमें कुछ अन्य अपूर्णताएं हैं। उलझन यह है कि इसमें बहुत सादगी है और यह कई अन्य कार्यान्वयन से बहुत कम है और यह> 9 5% नौकरी है।

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

यह मेरे लिए लग रहा है कि निम्न पंक्ति:

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

अन्यथा, इनपुट http://www.google.com के रूप में पार्स हो जाता है:

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

इस तरह से तय किया जाना चाहिए

found URL: http://www.go 
found URL: ogle.com 
संबंधित मुद्दे