PHP 5.4 में नई विशेषताओं के बारे में बहुत सारी चर्चाएं थीं, जैसे लक्षण, सरणियों का संक्षिप्त वाक्य विन्यास।
लेकिन कुछ विशेष रूप से महत्वपूर्ण परिवर्तन जो अक्सर PHP 5.4 के लिए भुला दिए जाते हैं वीरतापूर्ण रूप से कैटफ़ेक्ट (
स्टैकऑवरफ़्लो पर
Artefacto ) htmlspecialchars के अधिकांश।
प्रश्न में परिवर्तन केवल htmlspecialchars को ही नहीं, बल्कि htmlentities, htmlspecialchars_decode, html_entity_decode, get_html_translation_table को भी संदर्भित करता है।
यहाँ सबसे महत्वपूर्ण परिवर्तनों का संक्षिप्त विवरण दिया गया है:
- UTF-8 डिफ़ॉल्ट एन्कोडिंग
- त्रुटि से निपटने में सुधार (ENT_SUBSTITUTE)
- डॉक्टाइप प्रोसेसिंग (ENT_HTML401, ...)
UTF-8 डिफ़ॉल्ट एन्कोडिंग
जैसा कि आप जानते हैं, htmlspecialchars का तीसरा तर्क एन्कोडिंग है। ज्यादातर लोग बस इस तर्क को याद करते हैं, इस प्रकार डिफ़ॉल्ट एन्कोडिंग हो रही है। यह मान PHP 5.4 तक ISO-8859-1 था। नया संस्करण UTF-8 को डिफ़ॉल्ट बनाकर इसे ठीक करता है।
त्रुटि से निपटने में सुधार
HTMLspecialchars में 5.4 तक की हैंडलिंग में त्रुटि थी ... हम्म, चलो इसे "गैर-सहज" कहते हैं:
यदि आपने "गलत कोड अनुक्रम" युक्त स्ट्रिंग निर्दिष्ट किया है (यूनिकोड के लिए यह "गलत तरीके से एन्कोडेड स्ट्रिंग है") htmlspecialchars एक रिक्त स्ट्रिंग लौटाएगा। अच्छा, ठीक है, अभी तक तो अच्छा है। मजेदार बात यह है कि यह अतिरिक्त रूप से एक त्रुटि देगा, लेकिन केवल अगर
त्रुटि प्रदर्शन अक्षम किया गया है । अद्भुत है, है ना?
इसका मूल रूप से यह मतलब है कि आपके देव कंप्यूटर पर, आपको कोई त्रुटि नहीं दिखाई देगी, लेकिन उत्पादन वातावरण पर, त्रुटि लॉग उनके साथ भरा होगा। यह आश्चर्यजनक है।
PHP 5.4 में, सौभाग्य से, यह व्यवहार पहले से ही इतिहास है। त्रुटियां अब उत्पन्न नहीं होंगी।
इसके अलावा, दो विकल्प हैं जो आपको खाली स्ट्रिंग के लिए एक विकल्प निर्दिष्ट करने की अनुमति देते हैं:
- ENT_IGNORE: यह विकल्प (जो वास्तव में नया नहीं है, यह PHP 5.3 में था) बस किसी भी गलत कोड अनुक्रम को छोड़ देगा। यह दो कारणों से खराब है: सबसे पहले, आपको अमान्य वर्ण दिखाई नहीं देंगे। दूसरे, यह एक निश्चित सुरक्षा जोखिम पैदा करता है ।
- ENT_SUBSTITUTE: यह एक नया वैकल्पिक विकल्प है। केवल पात्रों को हटाने के बजाय, उन्हें एक यूनिकोड (प्रतिस्थापन चरित्र (U + FFFD) से बदल दिया जाएगा।
आइए विभिन्न व्यवहारों को देखें (
डेमो ):
<?php
जाहिर है, बाद वाला विकल्प बेहतर है। एक वास्तविक अनुप्रयोग में, यह इस तरह दिखेगा:
<?php
सिद्धांत प्रसंस्करण
PHP 5.4 में, सिद्धांत का उपयोग करने के लिए चार अतिरिक्त झंडे दिखाए गए हैं:
- ENT_HTML401 (HTML 4.01) => डिफ़ॉल्ट रूप से उपयोग किया जाता है
- ENT_HTML5 (HTML 5)
- ENT_XML1 (XML 1)
- ENT_XHTML (XHTML)
आपके द्वारा निर्दिष्ट doctype के आधार पर, htmlspecialchars (और अन्य संबंधित कार्य) विभिन्न इकाई तालिकाओं का उपयोग करेंगे।
उदाहरण (
डेमो ):
<?php var_dump(htmlspecialchars("'", ENT_HTML401));
इस प्रकार, HTML 5 के लिए, इकाई & apos; लौटा दिया जाएगा, लेकिन HTML 4.01 के लिए - क्योंकि यह समर्थन और apos नहीं करता है; - संख्यात्मक कोड & # 039 ;;
Htmlentities का उपयोग करते समय अंतर अधिक स्पष्ट हो जाता है, क्योंकि अधिक अंतर हैं।
जब आप कच्चे अनुवाद तालिकाओं को देखते हैं तो आप इसे आसानी से देख सकते हैं।
ऐसा करने के लिए, आप get_html_translation_table फ़ंक्शन का उपयोग कर सकते हैं। यहाँ XML 1 सिद्धांत (
डेमो ) के लिए एक उदाहरण दिया गया है:
<?php var_dump(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES | ENT_XML1));
निष्पादन परिणाम:
array(5) {
["""]=>
string(6) """
["&"]=>
string(5) "&"
["'"]=>
string(6) "'"
["<"]=>
string(4) "<"
[">"]=>
string(4) ">"
}
यह हमारी अपेक्षाओं के अनुरूप है: एक्सएमएल अकेले केवल पांच मुख्य संस्थाओं को परिभाषित करता है।
अब HTML 5 (
डेमो ) के लिए भी यही कोशिश करते हैं, और हम कुछ इस तरह देखेंगे:
array(1510) {
[" "]=>
string(5) "	"
["
"]=>
string(9) "
"
["!"]=>
string(6) "!"
["""]=>
string(6) """
["#"]=>
string(5) "#"
["$"]=>
string(8) "$"
["%"]=>
string(8) "%"
["&"]=>
string(5) "&"
["'"]=>
string(6) "'"
// ...
}
HTML 5 बड़ी संख्या में संस्थाओं को परिभाषित करता है - 1510, सटीक होना। आप HTML 4.01 और XHTML निर्दिष्ट करने का भी प्रयास कर सकते हैं, वे दोनों 253 संस्थाओं को परिभाषित करते हैं।
चयनित दस्तावेज़ प्रकार से भी प्रभावित एक और नई त्रुटि हैंडलिंग ध्वज है जिसका मैंने ऊपर उल्लेख नहीं किया था: ENT_DISALLOWED। यह ध्वज यूनिकोड प्रतिस्थापन पात्रों के साथ वर्णों को प्रतिस्थापित करेगा, जो औपचारिक रूप से सही कोड अनुक्रम हैं लेकिन इस DOCTYPE में अनुमति नहीं है।
इस प्रकार, आप गारंटी दे सकते हैं कि कोडिंग (इस प्रकार के दस्तावेज़ में) के संबंध में लौटा स्ट्रिंग हमेशा अच्छी तरह से बनेगा। हालांकि मुझे यकीन नहीं है कि इस ध्वज का उपयोग कितना देता है। ब्राउज़र अमान्य वर्णों को वैसे भी इनायत से संभालता है, इसलिए यह मुझे अनावश्यक लगता है (हालाँकि मैं शायद गलत हूं)।
वह सब नहीं है
... लेकिन मैं यहां सब कुछ सूचीबद्ध नहीं करना चाहता। मुझे लगता है कि ऊपर उल्लिखित तीन बदलाव सुधारों में सबसे महत्वपूर्ण हैं।
<?php htmlspecialchars("<\x80The End\xef\xbf\xbf>", ENT_QUOTES | ENT_HTML5 | ENT_DISALLOWED | ENT_SUBSTITUTE, 'UTF-8');