2009-06-11 17 views
7

में स्ट्रिंग से सबडोमेन निकालें मैं URL की एक श्रृंखला पर लूप कर रहा हूं और उन्हें साफ़ करना चाहता हूं। मेरे पास निम्न कोड है:रूबी

# Parse url to remove http, path and check format 
o_url = URI.parse(node.attributes['href']) 

# Remove www 
new_url = o_url.host.gsub('www.', '').strip 

कुछ यूआरएल में मौजूद सबडोमेन को हटाने के लिए मैं इसे कैसे बढ़ा सकता हूं?

उत्तर

2

कुछ की तरह:

def remove_subdomain(host) 
    # Not complete. Add all root domain to regexp 
    host.sub(/.*?([^.]+(\.com|\.co\.uk|\.uk|\.nl))$/, "\\1") 
end 

puts remove_subdomain("www.example.com") # -> example.com 
puts remove_subdomain("www.company.co.uk") # -> company.co.uk 
puts remove_subdomain("www.sub.domain.nl") # -> domain.nl 

तुम अब भी सब (रूट) जोड़ने की जरूरत है आप रूट डोमेन पर विचार डोमेन। तो '.uk' रूट डोमेन हो सकता है, लेकिन शायद आप होस्ट को '.co.uk' भाग से पहले रखना चाहते हैं।

1

किसी यूआरएल के सबडोमेन का पता लगाना एक सामान्य अर्थ में गैर-तुच्छ है - यदि आप केवल बुनियादी लोगों पर विचार करते हैं तो यह आसान है, लेकिन एक बार जब आप अंतरराष्ट्रीय क्षेत्र में जाते हैं तो यह मुश्किल हो जाता है।

संपादित करें: http://mylocalschool.k12.oh.us et al जैसे सामानों पर विचार करें।

6

यह एक मुश्किल मुद्दा है। कुछ शीर्ष-स्तरीय डोमेन दूसरे स्तर पर पंजीकरण स्वीकार नहीं करते हैं।

example.com और example.co.uk की तुलना करें। यदि आप पिछले दो डोमेन को छोड़कर बस सब कुछ पट्टी करेंगे, तो आप example.com, और co.uk के साथ समाप्त हो जाएंगे, जो कभी इरादा नहीं हो सकता है।

फ़ायरफ़ॉक्स प्रभावी शीर्ष-स्तरीय डोमेन द्वारा फ़िल्टर करके इसे हल करता है, और वे all these domains की एक सूची बनाए रखते हैं। publicsuffix.org पर अधिक जानकारी।

आप प्रभावी सूची टीएलडी के बगल में डोमेन दाएं को छोड़कर इस सूची का उपयोग कर सकते हैं। मुझे किसी भी रूबी पुस्तकालय की जानकारी नहीं है जो यह करता है, लेकिन एक को छोड़ना एक अच्छा विचार होगा!

अद्यतन: C, Perl and PHP libraries ऐसा करते हैं। सी संस्करण को देखते हुए, आप रूबी एक्सटेंशन बना सकते हैं। वैकल्पिक रूप से, आप रूबी को कोड पोर्ट कर सकते हैं।

+0

उस साइट के बारे में भूल गए, अच्छा जवाब –

3

नियमित अभिव्यक्ति आपको यहां थोड़ी मुश्किल हो सकती है, क्योंकि मेजबाननाम असीम जटिल हो सकते हैं - आपके पास एकाधिक सबडोमेन (यानी foo.bar.baz.com), या शीर्ष स्तर डोमेन हो सकता है (टीएलडी) में कई भाग हो सकते हैं (यानी www.baz.co.uk)।

एक जटिल नियमित अभिव्यक्ति के लिए तैयार है? :)

re = /^(?:(?>[a-z0-9-]*\.)+?|)([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$/i 
new_url = o_url.host.gsub(re, '\1').strip 

चलिए इसे दो खंडों में तोड़ दें। ^(?:(?>[a-z0-9-]*\.)+?|) वर्णों के एक या अधिक समूहों से मिलान करके सबडोमेन एकत्र करेगा, इसके बाद एक बिंदु (लालची, ताकि सभी सबडोमेन यहां मेल खाते हों)। कोई सबडोमेन (जैसे foo.com) के मामले में खाली विकल्प की आवश्यकता है। ([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$ वास्तविक होस्टनाम और टीएलडी एकत्र करेगा। यह या तो एक भाग वाली टीएलडी (जैसे .info, .com या। संग्रहालय), या दो भाग टीएलडी के लिए अनुमति देता है जहां दूसरा भाग दो अक्षर (जैसे .oh.us या .org.uk) है।

मैं निम्नलिखित नमूनों पर इस अभिव्यक्ति का परीक्षण किया:

foo.com => foo.com 
www.foo.com => foo.com 
bar.foo.com => foo.com 
www.foo.ca => foo.ca 
www.foo.co.uk => foo.co.uk 
a.b.c.d.e.foo.com => foo.com 
a.b.c.d.e.foo.co.uk => foo.co.uk 

ध्यान दें कि यह regex ठीक से होस्ट नामों है कि दो से अधिक टीएलडी के लिए "भागों" से मेल नहीं होगा!

28

मैंने डोमेनैटिक्स नामक एक पुस्तकालय लिखा है। आप इसे यहाँ पा सकते हैं: http://github.com/pauldix/domainatrix

require 'rubygems' 
require 'domainatrix' 

url = Domainatrix.parse("http://www.pauldix.net") 
url.public_suffix  # => "net" 
url.domain # => "pauldix" 
url.canonical # => "net.pauldix" 

url = Domainatrix.parse("http://foo.bar.pauldix.co.uk/asdf.html?q=arg") 
url.public_suffix  # => "co.uk" 
url.domain # => "pauldix" 
url.subdomain # => "foo.bar" 
url.path  # => "/asdf.html?q=arg" 
url.canonical # => "uk.co.pauldix.bar.foo/asdf.html?q=arg" 
+1

यह रूबी मणि publicsuffix.org पर मोज़िला डेटा फ़ाइल का संदर्भ देता है। – shadowbq

+0

यूआरआई से बेहतर काम करता है, उदाहरण के लिए, यूट्यूब वीडियो यूआरआई में हटा दिया जाता है? V = ******** फ़ील्ड केवल/घड़ी छोड़कर, जबकि डोमेनैटिक्स पूरी तरह से काम करता है – alexvicegrab

4

भावी पीढ़ी के लिए, यहाँ अक्टू, 2014 एक अद्यतन है:

मैं पर भरोसा करने के लिए एक और अधिक अप-टू-डेट निर्भरता लिए देख रहा था और public_suffix मणि पाया (RubyGems) (GitHub)। ज्ञात सार्वजनिक प्रत्यय की सूची बनाए रखकर इसे सक्रिय रूप से बनाए रखा जा रहा है और सभी शीर्ष-स्तरीय डोमेन और नेस्टेड-सबडोमेन मुद्दों को संभालता है।

प्रोटोकॉल और रास्तों अलग करना के लिए URI.parse साथ संयोजन में, यह वास्तव में अच्छी तरह से काम करता है:

❯❯❯ 2.1.2 ❯ PublicSuffix.parse(URI.parse('https://subdomain.google.co.uk/path/on/path').host).domain 
=> "google.co.uk" 
0

क्यों सिर्फ .com या .co.uk पट्टी और उसके बाद पर विभाजित नहीं '।' और अंतिम तत्व प्राप्त करें?

some_url.host.sub(/(\.co\.uk|\.[^.]*)$/).split('.')[-1] + $1 

यह कहना है कि यह हैकी लगता है। क्या कोई अन्य डोमेन हैं जैसे .co.uk?

0

मैंने वर्षों से विभिन्न और सैंड्री क्रॉलर और स्क्रैपर्स लिखने में बहुत कुछ किया है। इसे हल करने के लिए मेरा पसंदीदा मणि पेटी गामाचे द्वारा FuzzyUrl है: https://github.com/gamache/fuzzyurl। यह रूबी, जावास्क्रिप्ट और इलीक्सिर के लिए उपलब्ध है।