2010-09-08 10 views
15

से यूआरएल निकालने के लिए कैसे रूबी में एक सादे पाठ फ़ाइल से मैं सभी यूआरएल निकालें?टेक्स्ट

मैंने कुछ पुस्तकालयों की कोशिश की लेकिन वे कुछ मामलों में विफल हो गए। सबसे अच्छा तरीका क्या है?

+4

आपने कौन सी पुस्तकालयों की कोशिश की है, और वे किस तरह से विफल रहे हैं? – Zaz

+0

इस तरह के एक प्रश्न पूछते समय, हम समस्या को हल करने के आपके प्रयास को देखने की उम्मीद करते हैं। हम आपके कोड को ठीक करने में मदद करने में प्रसन्न हैं, लेकिन हमें आपके लिए कोड लिखने के लिए कह रहे हैं ऑफ-विषय है। कृपया "[पूछें]" और "[mcve]" पढ़ें। –

उत्तर

4

कौन से मामले असफल हो रहे हैं?

पुस्तकालय regexpert के अनुसार, आप

regexp = /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix 

उपयोग कर सकते हैं और फिर पाठ पर एक scan प्रदर्शन करते हैं।

संपादित करें: ऐसा लगता है कि regexp खाली स्ट्रिंग का समर्थन करता है। बस प्रारंभिक (^$) को हटा दें और आप तो क्या पहले से ही रूबी में आप के लिए प्रदान की जाती है का उपयोग कर की तरह

+1

दिलचस्प है कि यह रेगेक्स विफल रहता है जब URL एक आईपी पता – NullUserException

+1

हाँ है। मैंने वास्तव में आपके जवाब पर मतदान किया और "अपनी आवश्यकताओं के अनुसार इसे समायोजित करें"। जब उपयोगकर्ता @ पासवर्ड, या https के अलावा अन्य का उपयोग करते हैं, या किसी अन्य अजीब स्थिति में यह विफल रहता है। आरंभ करने के लिए आप शायद http://tools.ietf.org/html/rfc3986 पढ़ना नहीं चाहेंगे -_- – Chubas

+0

यह उपरोक्त के रूप में विफल रहता है। मैं यहां पूछ रहा हूं कि मैं "आपकी आवश्यकताओं के अनुसार इसे समायोजित करने में असमर्थ हूं"। – tapioco123

7

आप regex का उपयोग कर सकते हैं और .scan()

string.scan(/(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/) 

आपको लगता है कि regex के साथ शुरू कर सकते हैं और इसे समायोजित अपनी आवश्यकताओं के अनुसार।

82

काम हो गया:

require "uri" 
URI.extract("text here http://foo.example.org/bla and here mailto:[email protected] and here also.") 
# => ["http://foo.example.org/bla", "mailto:[email protected]"] 

और अधिक पढ़ें: http://railsapi.com/doc/ruby-v1.8/classes/URI.html#M004495

+4

यह ":" http: //blog.apptamers के साथ पाठ पर विफल रहता है।कॉम/पोस्ट/48613650042/यूरी-एक्स्ट्रैक्ट-ग़लत-इन-रूबी -1-9-3 –

+9

'URI.extract (yourString,/http (s)? | mailto /)' – titibouboul

+4

स्कीमा के बिना यूआरएल निकालने के लिए वैसे भी है? www.example.com –

10

मैं का उपयोग किया है twitter-text मणि

require "twitter-text" 
class UrlParser 
    include Twitter::Extractor 
end 

urls = UrlParser.new.extract_urls("http://stackoverflow.com") 
puts urls.inspect 
0
require 'uri'  
foo = #<URI::HTTP:0x007f91c76ebad0 URL:http://foobar/00u0u_gKHnmtWe0Jk_600x450.jpg> 
foo.to_s 
=> "http://foobar/00u0u_gKHnmtWe0Jk_600x450.jpg" 

संपादित करें: स्पष्टीकरण

जिन लोगों को जेएसओएन प्रतिक्रियाओं के माध्यम से यूआरआई को पार्स करने या नोकोगिरी या मैकेनाइजेशन जैसे स्क्रैपिंग टूल का उपयोग करके समस्याएं आ रही हैं, यह समाधान मेरे लिए काम करता है।

+0

की तरह शायद आपको अपना उत्तर समझा जाना चाहिए? अगर यह वास्तव में एक जवाब है? – Jensd

+0

अतिरिक्त स्पष्टीकरण जोड़ा गया। – Keon

+0

यह कोई समझ नहीं आता है और वाक्य रचनात्मक रूप से सही नहीं है। –

0

अपने इनपुट इस के समान दिखाई देता है:

"http://i.imgur.com/c31IkbM.gifv;http://i.imgur.com/c31IkbM.gifvhttp://i.imgur.com/c31IkbM.gifv" 

यानी यूआरएल जरूरी उनके आसपास सफेद स्थान, किसी भी सीमांकक द्वारा सीमांकित किया जा सकता है, या बिल्कुल भी उनके बीच कोई सीमांकक है की जरूरत नहीं है, तो आप उपयोग कर सकते हैं निम्नलिखित दृष्टिकोण:

def process_images(raw_input) 
    return [] if raw_input.nil? 
    urls = raw_input.split('http') 
    urls.shift 
    urls.map { |url| "http#{url}".strip.split(/[\s\,\;]/)[0] } 
end 

उम्मीद है कि यह मदद करता है!