2009-11-13 10 views
7

पायथन का उपयोग करके मैं उन यूआरएल के लिंक के साथ पाठ के एक समूह में सभी यूआरएल को प्रतिस्थापित करना चाहता हूं, जैसे जीमेल करता है। क्या यह एक लाइनर नियमित अभिव्यक्ति में किया जा सकता है?यूआरएल के लिंक के साथ पाठ में यूआरएल को प्रतिस्थापित करें

संपादित करें: पाठ के शरीर से मैं सिर्फ सादा पाठ का मतलब - कोई HTML

+1

हालांकि कोई यह मान लेगा कि आप * HTML बना रहे हैं, क्योंकि सादे पाठ में एक लिंक बनाम यूआरएल का कोई विशेष संकेत नहीं है। तो आप 'http://blah.com/page/ref/something?param=foo 'पर अपने सादे पाठ में पाए गए' http: //blah.com/page/ref/something? Param = foo' को कन्वर्ट करेंगे? – PaulMcG

+0

हां, फिर इसे एक HTML दस्तावेज़ – hoju

+0

में डाला जाएगा, अब तक यूआरएल से मेल खाने पर ध्यान केंद्रित किया गया है। लिंक के साथ इसे बदलने के बारे में कैसे? – hoju

उत्तर

9

आप एक डोम/HTML पार्स करने पुस्तकालय के साथ दस्तावेज़ को लोड कर सकते हैं (html5lib देखें), सभी पाठ नोड्स हड़पने, उन्हें एक नियमित रूप से मिलान के अभिव्यक्ति और इस तरह के रूप में एक PCRE का उपयोग कर उसके चारों ओर एंकर के साथ यूआरआई की एक regex प्रतिस्थापन के साथ पाठ नोड्स की जगह:

/(https?:[;\/?\\@&=+$,\[\]A-Za-z0-9\-_\.\!\~\*\'\(\)%][\;\/\?\:\@\&\=\+\$\,\[\]A-Za-z0-9\-_\.\!\~\*\'\(\)%#]*|[KZ]:\\*.*\w+)/g 

मैं काफी यकीन है कि आप के माध्यम से कोड़े और कहा कि यह करता है उपयोगिता के कुछ प्रकार प्राप्त कर सकते हैं हूँ, मैं हालांकि मेरे सिर के ऊपर से किसी के बारे में नहीं सोच सकता।

संपादित करें: यहाँ जवाब उपयोग करके देखें: एक स्ट्रिंग पर How do I get python-markdown to additionally "urlify" links when formatting plain text?

import re 

urlfinder = re.compile("([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}|((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+):[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\),\\\"]") 

def urlify2(value): 
    return urlfinder.sub(r'<a href="\1">\1</a>', value) 

कॉल urlify2 और मुझे लगता है कि अगर आप एक डोम वस्तु के साथ काम नहीं कर रहे हैं कि यह है।

+0

तो, यूआरएल में क्या अनुमति नहीं है? – Amarghosh

+0

बीटीडब्ल्यू, क्या होगा यदि लिंक पहले से ही एंकर टैग के href विशेषता के अंदर है? – Amarghosh

+0

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

0

जब आप कहते हैं कि "टेक्स्ट ऑफ बॉडी" क्या आपका मतलब है कि एक HTML दस्तावेज़ में एक सादा पाठ फ़ाइल या बॉडी टेक्स्ट है? यदि आप एचटीएमएल दस्तावेज़ चाहते हैं, तो आप इसे पार्स करने के लिए Beautiful Soup का उपयोग करना चाहेंगे; फिर, शरीर के पाठ के माध्यम से खोजें और टैग डालें।

वास्तविक यूआरएल मिलान करना शायद urlparse मॉड्यूल के साथ सबसे अच्छा किया जाता है। यहां पूरी चर्चा: How do you validate a URL with a regular expression in Python?

0

जीमेल यूआरएल की बात आने पर बहुत अधिक खुला है, लेकिन यह हमेशा सही नहीं है। जैसे यह www.a.b को हाइपरलिंक के साथ-साथ http://a.b में बनाएगा लेकिन यह अक्सर लिपटे पाठ और असामान्य (लेकिन मान्य) URL वर्णों के कारण विफल रहता है।

appendix A. A. Collected BNF for URI for syntax देखें, और उचित नियमित अभिव्यक्ति बनाने के लिए इसका उपयोग करें जो यूआरएल के आसपास के बारे में भी विचार करेगा। आपको अच्छी तरह से सलाह दी जाएगी कि कुछ परिदृश्यों पर विचार करें जहां यूआरएल समाप्त हो सकते हैं।

5

मैं एक बहुत चारों ओर शिकार, ये समाधान की कोशिश की और उनके पठनीयता या सुविधाओं से खुश नहीं था, इसलिए मैं निम्नलिखित लुढ़का:

_urlfinderregex = re.compile(r'http([^\.\s]+\.[^\.\s]*)+[^\.\s]{2,}') 

def linkify(text, maxlinklength): 
    def replacewithlink(matchobj): 
     url = matchobj.group(0) 
     text = unicode(url) 
     if text.startswith('http://'): 
      text = text.replace('http://', '', 1) 
     elif text.startswith('https://'): 
      text = text.replace('https://', '', 1) 

     if text.startswith('www.'): 
      text = text.replace('www.', '', 1) 

     if len(text) > maxlinklength: 
      halflength = maxlinklength/2 
      text = text[0:halflength] + '...' + text[len(text) - halflength:] 

     return '<a class="comurl" href="' + url + '" target="_blank" rel="nofollow">' + text + '<img class="imglink" src="/images/linkout.png"></a>' 

    if text != None and text != '': 
     return _urlfinderregex.sub(replacewithlink, text) 
    else: 
     return '' 

आप छवि एक कड़ी बाहर निकलने के लिए की आवश्यकता होगी, लेकिन यह बहुत आसान है। यह विशेष रूप से उपयोगकर्ता द्वारा सबमिट किए गए पाठ जैसे टिप्पणियों के लिए है जो मुझे लगता है कि आम तौर पर लोग क्या कर रहे हैं।

+0

मैंने कुछ फ्रेमवर्क भी शामिल किए, जिनमें उन्होंने अपना स्वयं का लिंक फंक्शन लागू किया, और मैंने इसे गैर-जटिल उद्देश्यों के लिए सबसे अधिक पढ़ने योग्य पाया। – JayD3e

+1

+1 इसे रोल करने के लिए धन्यवाद, मुझे परेशानी बचाई =) – mkoistinen

संबंधित मुद्दे