php ENT_HTML5, ENT_HTML401,… html_entity_decode पर संशोधक क्या करते हैं?



html-entities htmlspecialchars (1)

मुझे आश्चर्य होने लगा कि इन स्थिरांक का क्या व्यवहार है जब मैंने इन स्थिरांक को htmlspecialchars पृष्ठ पर देखा। प्रलेखन बकवास था, इसलिए मैंने PHP के स्रोत कोड में खुदाई शुरू कर दी।

मूल रूप से, ये स्थिरांक प्रभावित करते हैं कि कुछ इकाइयां एन्कोडेड हैं या नहीं (या html_entity_decode लिए डीकोड किया html_entity_decode )। सबसे स्पष्ट प्रभाव यह है कि क्या एपोस्ट्रोफ ( ' ) एन्कोडेड है ' ( ENT_HTML401 ) या ' (दूसरो के लिए)। इसी प्रकार, यह निर्धारित करता है कि क्या ' html_entity_decode का उपयोग करते समय डिकोड किया गया है या नहीं। ( ' हमेशा डिकोड होता है)।

सभी usages ext / standard / html.c और इसकी हेडर फाइल में पाए जा सकते हैं। Ext / standard / html.h से:

#define ENT_HTML_DOC_HTML401            0
#define ENT_HTML_DOC_XML1                       16
#define ENT_HTML_DOC_XHTML                      32
#define ENT_HTML_DOC_HTML5                      (16|32)

(उनके PHP निरंतर नाम पाने के लिए ENT_HTML_DOC_ द्वारा ENT_ को बदलें)

मैंने इन स्थिरांक की सभी घटनाओं की तलाश शुरू कर दी है, और ENT_* स्थिरांक के व्यवहार पर निम्नलिखित साझा कर सकते हैं:

  • यह प्रभावित करता है कि कौन से संख्यात्मक निकाय डिकोड किए जाएंगे या नहीं। उदाहरण के लिए,  ENT_HTML401 और ENT_XHTML और ENT_XML1 लिए किसी अपठनीय / अमान्य वर्ण में डिकोड हो जाता है। ENT_HTML5 हालांकि, यह एक अमान्य चरित्र माना जाता है और इसलिए यह  जाता है  । ( C फ़ंक्शन यूनिकोड_cp_is_allowed )
  • ENT_SUBSTITUTE सक्षम होने के साथ, एक निर्दिष्ट वर्ण सेट के लिए अमान्य कोड यूनिट अनुक्रम को बदल दिया जाता है। (दस्तावेज़ प्रकार पर निर्भर नहीं करता है!)
  • ENT_DISALLOWED सक्षम होने के साथ, निर्दिष्ट दस्तावेज़ प्रकार के लिए अस्वीकृत कोड बिंदुओं को बदल दिया जाता है। (चारसेट पर निर्भर नहीं है!)
  • ENT_IGNORE साथ, ENT_IGNORE से समान अमान्य कोड यूनिट अनुक्रम हटा दिए ENT_SUBSTITUTE हैं और कोई प्रतिस्थापन नहीं किया जाता है ("दस्तावेज़ प्रकार" की पसंद पर निर्भर करता है, जैसे ENT_HTML5 )
  • अस्वीकार करें 
 ENT_HTML5 ( पंक्ति 976 ) के लिए
  • ENT_XHTML साथ इकाई का नक्शा साझा करता है। फर्क सिर्फ इतना है कि ' ENT_XHTML साथ एक एपॉस्ट्रॉफी में परिवर्तित किया जाएगा जबकि ENT_HTML401 इसे परिवर्तित नहीं करता ( यह पंक्ति देखें)
  • ENT_HTML401 और ENT_XHTML बिलकुल एक ही इकाई के नक्शे का उपयोग करते हैं (पिछले बिंदु से अंतर ENT_XHTML हैं)। ENT_HTML5 अपने स्वयं के मानचित्र का उपयोग करता है। अन्य (वर्तमान में ENT_XML1 ) के पास बहुत सीमित डिकोडिंग मैप ( > & < ENT_XML1 ' " और उनके संख्यात्मक समकक्ष) हैं। ( सी समारोह देखें unescape_inverse_map )
  • पिछले बिंदु पर ध्यान दें: जब केवल कुछ संस्थाओं को बच जाना चाहिए ( ENT_XML1 में ENT_XML1 ), सभी निकाय मानचित्र ENT_XML1 को छोड़कर ENT_XML1 के समान उपयोग करेंगे। वह एक ' उपयोग नहीं करेगा ' , लेकिन '

जिसमें लगभग सब कुछ शामिल है। मैं सभी इकाई अंतरों को सूचीबद्ध नहीं करने जा रहा हूं, इसके बजाय मैं कुछ पाठ फ़ाइलों के लिए https://github.com/php/php-src/tree/php-5.4.11/ext/standard/html_tables पर इंगित करना चाहूंगा प्रत्येक प्रकार के लिए मैपिंग।

ENT_ * मुझे htmlspecialchars के लिए क्या उपयोग करना चाहिए?

ENT_COMPAT (डिफ़ॉल्ट) या ENT_NOQUOTES के साथ htmlspecialchars का उपयोग करते समय, यह कोई फर्क नहीं पड़ता कि आप कौन सा चुनते हैं (नीचे देखें)। मैंने एसओ पर यहां कुछ जवाब देखे जो इस तरह से उबलते हैं:

<input value="<?php echo htmlspecialchars($str, ENT_HTML5);?>" >

यह असुरक्षित है । यह डिफ़ॉल्ट मान को ओवरराइड करेगा ENT_HTML401 | ENT_COMPAT ENT_HTML401 | ENT_COMPAT जिसमें एचटीएमएल 5 संस्थाओं का उपयोग करने के लिए अंतर है, लेकिन यह भी कि उद्धरण अब बच नहीं रहे हैं! इसके अलावा, यह निरर्थक कोड है। ENT_HTML401 द्वारा एन्कोड किए जाने वाली ENT_HTML401 सभी ENT_HTML401 , ENT_HTML5 इत्यादि के लिए समान हैं।

इसके बजाय बस ENT_COMPAT या ENT_QUOTES उपयोग करें। उत्तरार्द्ध भी तब काम करता है जब आप विशेषताओं ( value='foo' ) के लिए एपोस्ट्रोफ का उपयोग करते हैं। यदि आपके पास ENT_HTML401 लिए केवल दो तर्क हैं, तो तर्क को शामिल न करें क्योंकि यह डिफ़ॉल्ट है ( ENT_HTML401 0 है, याद रखें?)।

जब आप पृष्ठ पर कुछ प्रिंट करना चाहते हैं (टैग्स के बीच, विशेषताएँ नहीं), तो यह बिल्कुल भी मायने नहीं रखता है कि आप जिसे चुनते हैं, उसका समान प्रभाव होगा। यह ENT_NOQUOTES | ENT_HTML401 का उपयोग करने के लिए पर्याप्त है ENT_NOQUOTES | ENT_HTML401 ENT_NOQUOTES | ENT_HTML401 जो संख्यात्मक मान 0 बराबर है।

नीचे भी देखें, ENT_SUBTITUTE और ENT_DISALLOWED के बारे में।

ENT_ * मुझे htmlentities के लिए क्या उपयोग करना चाहिए?

यदि आपका टेक्स्ट एडिटर या डेटाबेस इतना भद्दा है कि आप गैर-यूएस-एएससीआईआई अक्षर (जैसे यूटीएफ -8) को शामिल नहीं कर सकते हैं, तो आप htmlentities का उपयोग कर सकते हैं। अन्यथा, कुछ बाइट्स बचाएं और इसके बजाय htmlspecialchars का उपयोग करें (ऊपर देखें)।

क्या आपको ENT_HTML401 , ENT_HTML5 या कुछ और का उपयोग करने की आवश्यकता है, ENT_HTML5 बात पर निर्भर करता है कि आपका पृष्ठ कैसे परोसा जाता है। जब आपके पास HTML5 पेज हो ( <!doctype html> ENT_HTML5 <!doctype html> ), तो ENT_HTML5 उपयोग ENT_HTML5 । एक्सएचटीएमएल या एक्सएमएल? इसी ENT_XHTML या ENT_XML1 उपयोग करें। कोई सिद्धांत या सादे ol 'HTML4 के साथ, ENT_HTML401 उपयोग ENT_HTML401 (जो चूक होने पर डिफ़ॉल्ट है)।

क्या मुझे ENT_DISALLOWED, ENT_IGNORE या ENT_SUBSTITUTE का उपयोग करना चाहिए?

डिफ़ॉल्ट रूप से, दिए गए वर्ण सेट के लिए अमान्य बाइट अनुक्रम हटा दिए जाते हैं। अमान्य बाइट अनुक्रम के स्थान पर होने के लिए, ENT_SUBSTITUTE निर्दिष्ट करें। (ध्यान दें कि &#FFFD; गैर-UTF-8 वर्णमाला के लिए दिखाया गया है)। जब आप ENT_IGNORE निर्दिष्ट करते हैं, हालांकि, यदि आप ENT_SUBSTITUTE निर्दिष्ट ENT_SUBSTITUTE , तो भी ये वर्ण नहीं दिखाए ENT_SUBSTITUTE

दस्तावेज़ प्रकार के लिए अमान्य वर्णों को उसी प्रतिस्थापन वर्ण (या उसकी इकाई) द्वारा प्रतिस्थापित किया जाता है जब ENT_DISALLOWED निर्दिष्ट किया जाता है। यह ENT_IGNORE सेट (जिसका ENT_IGNORE लिए अमान्य वर्णों से कोई लेना-देना नहीं है) की परवाह किए बिना होता है।

चूंकि php 5.4 html_entity_d timecode न्यूनतम विवरण के साथ चार नए झंडे पेश करती है

ENT_HTML401 Handle code as HTML 4.01.
ENT_XML1    Handle code as XML 1.
ENT_XHTML   Handle code as XHTML.
ENT_HTML5   Handle code as HTML 5. 

मैं समझना चाहता हूं कि वे क्या हैं। किन मामलों में वे महत्वपूर्ण हैं?

मेरा अनुमान है, (लेकिन मैं गलत हो सकता हूं) यह है कि कोई भी अलग मानक, कुछ असामान्य वर्णों को कूटबद्ध करता है, लेकिन कोई अन्य ऐसा नहीं करता है, इसलिए इसका सम्मान करने के लिए, वे यहां हैं।

मेरा शोध: htmlentities की एक ही न्यूनतम व्याख्या है, जिसका कोई उदाहरण नहीं है। मैं बिना किसी भाग्य के गुगली कर चुका हूं।





htmlspecialchars