2010-12-08 11 views
12

से यूआरएल निकालें मैं अक्षरों की एक स्ट्रिंग से यूआरएल निकालने के लिए एक विश्वसनीय समाधान खोजने की कोशिश कर रहा हूं। मेरे पास एक ऐसी साइट है जहां उपयोगकर्ता प्रश्नों का उत्तर देते हैं और स्रोत बॉक्स में, जहां वे जानकारी का स्रोत दर्ज करते हैं, मैं उन्हें एक यूआरएल दर्ज करने की अनुमति देता हूं। मैं उस यूआरएल को निकालना चाहता हूं और इसे हाइपरलिंक बनाना चाहता हूं। याहू जवाब कैसे करता है इसके समान।स्ट्रिंग

क्या कोई भी एक विश्वसनीय समाधान जानता है जो यह कर सकता है?

मेरे द्वारा प्राप्त किए गए सभी समाधान कुछ यूआरएल के लिए काम करते हैं लेकिन दूसरों के लिए नहीं।

धन्यवाद

उत्तर

22

जॉन Gruber spent a fair amount of time लिंक का पता लगाने के लिए "उन सब को शासन करने के लिए एक रेगुलर एक्सप्रेशन" को परिपूर्ण है। preg_replace() का प्रयोग के रूप में अन्य उत्तर के अनुसार निम्न regex का उपयोग कर सबसे सटीक में से एक होना चाहिए, नहीं तो सबसे सटीक, एक लिंक का पता लगाने के लिए विधि:

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])) 

यदि आप केवल मिलान करना चाहते थे HTTP/HTTPS:

(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])) 
+0

बिल्कुल वही जो मैं खोज रहा था! धन्यवाद। –

+4

कोई भी जो सभी उप-पैटर्न को गैर कैप्चरिंग में परिवर्तित करना चाहता है, और आगे की धड़कन से बच निकला: \ b (?: (?: [az] [\ w -] +: (?: \/{1,3} | [a-z0-9%]) | www \ d {0,3 } | [एक-Z0-9 \। -] [az] {2,4} \ /) (?: [^ \ s() <>] | \ (([।] [[।]?^\ s() <>] |: (?: \ ((: [^ \ s() (? \ ([^ \ s() <>] \))) * \)) + <> ] |।? (: \ ([!^\ s() <>] \))) * \) | [^ \ s'() \ [\] {} ;: ' ", <>« »" "'']]) –

+0

टीएलडी में 4 से अधिक वर्ण हो सकते हैं, देखें: http://www.iana.org/domains/root/db – Toto

0

याहू! उत्तर लिंक पहचान की काफी अच्छी नौकरी करता है जब लिंक ठीक से लिखा जाता है और अन्य पाठ से अलग होता है, लेकिन पिछला विराम चिह्न अलग करने में यह बहुत अच्छा नहीं है। उदाहरण के लिए The links are http://example.com/somepage.php , http://example.com/somepage2.php , and http://example.com/somepage3.php . में पहले दो और तीसरे स्थान पर अल्पविराम शामिल होंगे।

लेकिन यदि स्वीकार्य है, तो इस तरह पैटर्न यह करना चाहिए:

\<http:[^ ]+\> 

ऐसा लगता है कि stackoverflow के पार्सर बेहतर है। खुला स्रोत है?

+0

स्मार्ट, लेकिन अभी भी सही नहीं है। ssh + svn जैसी चीज़ों को याद करता है। – DampeS8N

3
$string = preg_replace('/https?:\/\/[^\s"<>]+/', '<a href="$0" target="_blank">$0</a>', $string); 

यह केवल http/https से मेल खाता है, लेकिन यह वास्तव में एकमात्र प्रोटोकॉल है जिसे आप एक लिंक में बदलना चाहते हैं। आप दूसरों चाहते हैं, आप इसे इस तरह बदल सकते हैं:

$string = preg_replace('/(https?|ssh|ftp):\/\/[^\s"]+/', '<a href="$0" target="_blank">$0</a>', $string); 
+1

कोड इंजेक्शन से बचने के लिए आप मिलान किए गए स्ट्रिंग पर '<' या 'htmlspecialchars' को भी लागू करना चाहते हैं। – Gumbo

+0

अच्छा, लेकिन यदि आप अभिव्यक्ति को देखते हैं, तो यह सफेद-स्थान और '" 'के अलावा कुछ भी अनुमति देता है। मुझे विश्वास है कि किसी भी HTML इंजेक्शन को समाप्त करता है। – Jonah

+1

ब्रॉन: नहीं, आप मिलान मूल्य का उपयोग नहीं कर रहे हैं, बल्कि विशेषता मान के रूप में भी तत्व टेक्स्ट सामग्री। – Gumbo

-1

यह कोड मेरे लिए काम किया गया है।

function makeLink($string){ 

/*** make sure there is an http:// on all URLs ***/ 
$string = preg_replace("/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i", "$1http://$2",$string); 
/*** make all URLs links ***/ 
$string = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>",$string); 
/*** make all emails hot links ***/ 
$string = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<a href=\"mailto:$1\">$1</a>",$string); 

return $string; 
} 
+1

आप टीएलडी को 3 अक्षरों तक सीमित क्यों कर रहे हैं? http://www.iana.org/domains/root/db पर एक नज़र डालें – Toto