2009-07-24 14 views
27

मैं क्लिक करने योग्य लिंक पर सादे पाठ यूआरएल को बदलने के लिए एक नियमित अभिव्यक्ति का उपयोग कर रहा हूं।क्या एक यूआरएल में अर्ध-कॉलन हो सकता है?

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

लेकिन, कभी कभी पाठ के मुख्य भाग में, यूआरएल प्रत्येक पंक्ति में एक छोर पर एक सेमी-कोलन साथ enumerated हैं। असली यूआरएल में कोई भी ";" नहीं है। एक यूआरएल में या अर्धविराम एक URL के अंत के एक मार्कर माना जा सकता है;()

http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=275; 
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=123; 
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=124 

यह अर्धविराम है करने की अनुमति दी है? यह मेरी नियमित अभिव्यक्ति में कैसे फिट होगा?

उत्तर

35

semicolon is reserved और इसका विशेष उद्देश्य (जो योजना पर निर्भर करता है) को छोड़कर अनएन्कोडेड नहीं किया जा सकता है। अनुभाग 2.2:

कई यूआरएल योजनाओं एक विशेष अर्थ के लिए कुछ खास पात्रों को आरक्षित: URL के योजना विशेष भाग में उनकी उपस्थिति एक नामित अर्थ विज्ञान है। यदि एक ऑक्टेट के अनुरूप वर्ण किसी योजना में आरक्षित है, तो ऑक्टेट को एन्कोड किया जाना चाहिए। पात्र ";", "/", "?", ":", "@", "=" और "&" योजना के भीतर विशेष अर्थ के लिए आरक्षित वर्ण हो सकते हैं। कोई अन्य पात्र एक योजना के भीतर आरक्षित नहीं हो सकता है।

+19

"अनन्य नहीं किया जा सकता है": ... इसके विशेष अर्थ के अलावा किसी अन्य उद्देश्य के लिए। प्रश्न का सही उत्तर है "हां, यूआरएल में अर्धविराम होना कानूनी है", लेकिन मुझे इस जवाब से प्राप्त इंप्रेशन (spec उद्धरण नहीं, लेकिन सारांश) है "नहीं, एक unencoded अर्धविराम नहीं हो सकता है यूआरएल में प्रयोग किया जाता है। " – Miles

+0

@ माइल्स – Greg

+0

को स्पष्ट करने के लिए संपादित किया गया है, मुझे पार्टी के लिए देर हो चुकी है, लेकिन यह कोड स्पष्ट रूप से http/https urls के साथ सौदा करता है, जो अनुमति देता है; क्वेरी स्ट्रिंग सेपरेटर (इसके बजाए और) के रूप में ... वास्तव में, बेन ने पहले से ही इसे कवर किया है। – Powerlord

5

http://www.ietf.org/rfc/rfc3986.txt यूआरएल को कवर करता है और अनएन्डेड रूप में कौन से वर्ण प्रकट हो सकते हैं। यह देखते हुए कि अर्धविराम युक्त यूआरएल ब्राउज़र में ठीक से काम करते हैं, तो आपके कोड को उनका समर्थन करना चाहिए।

11

अर्ध-कॉलन एक कानूनी यूआरआई चरित्र है; यह उप सीमांकक श्रेणी के अंतर्गत आता: http://www.ietf.org/rfc/rfc3986.txt

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

23

डब्ल्यू 3 सी सीजीआई कार्यक्रमों को स्वीकार करने के लिए प्रोत्साहित करता है; साथ ही क्वेरी स्ट्रिंग्स में & (यानी ?name=fred&age=50 और ?name=fred;age=50 का इलाज उसी तरह करें)। ऐसा माना जाता है क्योंकि & को & amp के रूप में एन्कोड किया जाना है; एचटीएमएल में जबकि; ऐसा नहीं करता।

+1

डब्ल्यू 3 सी प्रोत्साहन मुख्य रूप से यहां प्रतीत होता है ...http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#hB.2.2 –

1

उद्धरण आरएफसी इस प्रश्न का उत्तर देने में मददगार नहीं है, क्योंकि आप अर्धविराम (और उस मामले के लिए अल्पविराम) के साथ यूआरएल का सामना करेंगे। हमारे पास एक रेगेक्स था जिसने सेमीकॉलन और कॉमा को संभाला नहीं था, और हमारे कुछ उपयोगकर्ताओं ने न्यूशेलमेल में शिकायत की क्योंकि उनके साथ मौजूद यूआरएल वास्तव में जंगली में मौजूद हैं। फेसबुक या ट्विटर में एक डमी यूआरएल बनाने का प्रयास करें जिसमें ';' है या ',' और आप देखेंगे कि उन दो सेवाओं में पूर्ण यूआरएल को सही तरीके से एन्कोड किया गया है।

मैं Regex हम निम्नलिखित पैटर्न के साथ प्रयोग कर रहे थे की जगह (और परीक्षण किया है कि यह काम करता है):

string regex = @"((www\.|(http|https|ftp|news|file)+\:\/\/)[&#95;.a-zA-Z0-9-]+\.[a-zA-Z0-9\/&#95;:@=.+?,##%&~_-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])"; 

यह Regex http://rickyrosario.com/blog/converting-a-url-into-a-link-in-csharp-using-regular-expressions/ से आया है (एक मामूली संशोधन के साथ)

+3

मैंने कोड स्वरूपण जोड़ा ताकि हम इसे अधिक आसानी से पढ़ सकें, लेकिन मैं इसका उपयोग करने की अनुशंसा नहीं करता regex। स्पष्ट वेब मैंगलिंग और कई अनावश्यक बैकस्लाश और पाइप को छोड़कर, अंतिम दो चरित्र वर्ग गंभीर रूप से त्रुटिपूर्ण हैं। न केवल वे अर्धविरामों और कोष्ठक जैसे वैध पात्रों को बहिष्कृत करते हैं, जो अंतिम सभी * अमान्य * वर्णों जैसे उद्धरण चिह्न, ब्रेसिज़ और गैर-ASCII वर्णों से मेल खाते हैं। –

4

हाँ, अर्धविराम हैं यूआरएल में मान्य हालांकि, यदि आप उन्हें अपेक्षाकृत असंगठित गद्य से निकाल रहे हैं, तो संभव है कि यूआरएल के अंत पर अर्धविराम मानना ​​सुरक्षित हो, वाक्य वाक्य विराम चिह्न के रूप में है। अन्य वाक्य-विराम चिह्नों जैसे कि अवधि, प्रश्न चिह्न, उद्धरण इत्यादि के लिए भी जाता है ..

यदि आप केवल एक स्पष्ट http[s] प्रोटोकॉल के साथ यूआरएल में रूचि रखते हैं, और आपका रेगेक्स स्वाद दिखने का समर्थन करता है, तो यह रेगेक्स पर्याप्त होना चाहिए:

https?://[\w!#$%&'()*+,./:;[email protected]\[\]-]+(?<![!,.?;:"'()-])

प्रोटोकॉल के बाद, यह बस एक या अधिक वर्ण को एक ऐसे URL में मान्य हो सकता है से मेल खाता है, बिल्कुल संरचना के बारे में चिंता किए बिना। लेकिन फिर यह आवश्यकतानुसार कई पदों को पीछे छोड़ देता है जब तक कि अंतिम चरित्र ऐसा कुछ नहीं है जो वाक्य विराम चिह्न हो।

6

तकनीकी रूप से, एक अर्धविराम एक यूआरएल स्ट्रिंग में एक कानूनी उप-डिलीमीटर है; स्रोत स्रोत के बहुत सारे को http://www.ietf.org/rfc/rfc3986.txt समेत उद्धृत किया गया है।

और कुछ वैध उद्देश्यों के लिए इसका उपयोग करते हैं, हालांकि इसका उपयोग साइट-विशिष्ट (यानी, केवल उस साइट के उपयोग के लिए) है क्योंकि इसका उपयोग साइट द्वारा इसका उपयोग करके परिभाषित किया जाना है।

असली दुनिया में हालांकि, यूआरएल में अर्धविरामों के लिए प्राथमिक उपयोग एक वैध यूआरएल के पीछे एक वायरस या फ़िशिंग यूआरएल छिपाना है।

उदाहरण के लिए

, इस लिंक के साथ किसी एक ईमेल भेज:

http: // www.yahoo.com/junk/nonsense;0200.0xfe.0x37.0xbf/malicious_file/

में परिणाम होगा याहू! लिंक (www.yahoo.com/junk/nonsense) को अनदेखा किया जा रहा है क्योंकि भले ही यह वैध है (यानी, सही ढंग से गठित) कोई ऐसा पृष्ठ मौजूद नहीं है। लेकिन दूसरा लिंक (0200.0xfe.0x37.0xbf/malicious_file /) संभवतः मौजूद है * और उपयोगकर्ता को दुर्भावनापूर्ण_फाइल पृष्ठ पर निर्देशित किया जाएगा; जहां किसी के कॉर्पोरेट आईटी मैनेजर को एक रिपोर्ट मिल जाएगी और एक को गुलाबी पर्ची मिल जाएगी।

और इससे पहले कि सभी नायकों को अपना डंडर मिल जाए, यह बिल्कुल ठीक है कि नई फेसबुक फ़िशिंग समस्या कैसे काम करती है। सामान्य रूप से दोषी की रक्षा के लिए नाम बदल दिए गए हैं।

* ऐसा कोई पृष्ठ वास्तव में मेरे ज्ञान के लिए मौजूद नहीं है। दिखाया गया लिंक केवल इस चर्चा के प्रयोजनों के लिए है।

+2

कौन सा ऐप '0200.0xfe.0x37.0xbf' खुलता है क्योंकि यह जानता है कि याहू लिंक 404 स्थिति लौटाएगा ?! मुझे समझ में नहीं आता है। – mgutt

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