पूर्ण पार्सिंग करने का रेगेक्स काफी भयावह है। मैंने पठनीयता के लिए बैकरेफरेंस का नाम शामिल किया है, और प्रत्येक भाग को अलग-अलग लाइनों में तोड़ दिया है, लेकिन यह अभी भी इस तरह दिखता है:
^(?:(?P<protocol>\w+(?=:\/\/))(?::\/\/))?
(?:(?P<host>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^\/?#:]+)(?::(?P<port>[0-9]+))?)\/)?
(?:(?P<path>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)\/)?
(?P<file>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)
(?:\?(?P<querystring>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^#])+))?
(?:#(?P<fragment>.*))?$
इस क्रिया को करने के लिए जिस चीज की आवश्यकता होती है वह यह है कि प्रोटोकॉल या पोर्ट को छोड़कर, किसी भी हिस्से में HTML इकाइयाँ हो सकती हैं, जो टुकड़े के विखंडन को काफी पेचीदा बना देती हैं। तो पिछले कुछ मामलों में - मेजबान, पथ, फ़ाइल, क्वेरी स्ट्रिंग, और टुकड़ा, हम या तो किसी भी html इकाई या किसी चरित्र है कि नहीं एक के लिए अनुमति देने ?
या #
। Html इकाई के लिए रेगेक्स इस तरह दिखता है:
$htmlentity = "&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);"
जब इसे निकाला जाता है (मैंने इसे दर्शाने के लिए मूंछ के सिंटैक्स का उपयोग किया है), यह थोड़ा अधिक सुपाठ्य हो जाता है:
^(?:(?P<protocol>(?:ht|f)tps?|\w+(?=:\/\/))(?::\/\/))?
(?:(?P<host>(?:{{htmlentity}}|[^\/?#:])+(?::(?P<port>[0-9]+))?)\/)?
(?:(?P<path>(?:{{htmlentity}}|[^?#])+)\/)?
(?P<file>(?:{{htmlentity}}|[^?#])+)
(?:\?(?P<querystring>(?:{{htmlentity}};|[^#])+))?
(?:#(?P<fragment>.*))?$
जावास्क्रिप्ट में, निश्चित रूप से, आप नाम का उपयोग नहीं कर सकते, इसलिए रेगेक्स बन जाता है
^(?:(\w+(?=:\/\/))(?::\/\/))?(?:((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^\/?#:]+)(?::([0-9]+))?)\/)?(?:((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)\/)?((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)(?:\?((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^#])+))?(?:#(.*))?$
और प्रत्येक मैच में, प्रोटोकॉल है \1
, होस्ट है \2
, पोर्ट है \3
, पथ है \4
, फ़ाइल है \5
, क्लेरिस्ट्रिंग है \6
, और टुकड़ा है \7
।
CrackUrl
। यदि ऐसा कोई फ़ंक्शन मौजूद है, तो इसका उपयोग करें, यह किसी भी हाथ से तैयार किए गए कोड की तुलना में अधिक विश्वसनीय और अधिक कुशल होने की गारंटी है।