PHP

2010-05-04 5 views
13

में संख्यात्मक HTML इकाइयों को डीकोड करने के लिए कैसे मैं संख्यात्मक इकाई से स्ट्रिंग में एन्कोडेड लंबे डैश को डीकोड करने का प्रयास कर रहा हूं, लेकिन ऐसा लगता है कि मुझे ऐसा कोई फ़ंक्शन नहीं मिल रहा है जो इसे ठीक से कर सके।PHP

सबसे अच्छा जो मैंने पाया वह mb_decode_numericentity() है, हालांकि, किसी कारण से यह लंबे डैश और कुछ अन्य विशेष पात्रों को डीकोड करने में विफल रहता है।

$str = '–'; 

$str = mb_decode_numericentity($str, array(0xFF, 0x2FFFF, 0, 0xFFFF), 'ISO-8859-1'); 

यह "?" वापस आ जाएगा।

कोई भी इस समस्या को हल करने के बारे में जानता है?

+3

आईएसओ -885 9 -1 में लंबे समय तक डैश मौजूद है? –

+1

@ कोलश्रेपल: दरअसल नहीं। यह विंडोज सीपी 1252 में मौजूद है, जो समान है, लेकिन आईएसओ -885 9 -1 नहीं। बेहतर: यूटीएफ -8 का उपयोग करें। – bobince

+1

निश्चित रूप से, आईएसओ/आईईसी 885 9 -1 (लैटिन -1) में कोई लंबा डैश नहीं है। वास्तव में, यह एक यूनिकोड चरित्र है, और यूटीएफ -8 का उपयोग करने में मदद मिली। यह मेरी गलती थी कि मैं ब्राउज़र में एन्कोडिंग को बदलना भूल गया। सभी को धन्यवाद! – Yuriy

उत्तर

1

mb_decode_numericentity हेक्साडेसिमल, केवल दशमलव को संभाल नहीं करता है। आप के साथ अपेक्षित परिणाम मिलता है:

$str = '–'; 

$str = mb_decode_numericentity ($str , Array(255, 3145727, 0, 65535) , 'ISO-8859-1'); 

आप hexdec का उपयोग दशमलव में अपने हेक्साडेसिमल कन्वर्ट करने के लिए कर सकते हैं।

$str = '–'; 

$str = html_entity_decode($str); 
+0

त्वरित उत्तर के लिए धन्यवाद, लेकिन यह '?' देता है भी। – Yuriy

+0

> $ str = html_entity_decode ($ str); यह पहली बात थी जिसकी मैंने कोशिश की थी। सं। – Yuriy

+0

@Yuriy कृपया इस ** उत्तर ** पर अपनी टिप्पणियों को अस्वीकार या पुष्टि करें ** इस ** प्रश्न ** को आपकी गलती के बारे में टिप्पणी लिखने के बाद। मुझे लगता है कि 'html_entity_decode() 'सबसे सरल सही समाधान है। – Apostle

19

निम्नलिखित कोड का टुकड़ा (ज्यादातर here से चोरी और बेहतर) शाब्दिक, आंकिक दशमलव के लिए काम करेंगे, और संख्यात्मक हेक्सा-दशमलव संस्थाओं:

इसके अलावा, जिज्ञासा से बाहर है, तो निम्न काम करता है

header("content-type: text/html; charset=utf-8"); 

/** 
* Decodes all HTML entities, including numeric and hexadecimal ones. 
* 
* @param mixed $string 
* @return string decoded HTML 
*/ 

function html_entity_decode_numeric($string, $quote_style = ENT_COMPAT, $charset = "utf-8") 
{ 
$string = html_entity_decode($string, $quote_style, $charset); 
$string = preg_replace_callback('~&#x([0-9a-fA-F]+);~i', "chr_utf8_callback", $string); 
$string = preg_replace('~&#([0-9]+);~e', 'chr_utf8("\\1")', $string); 
return $string; 
} 

/** 
* Callback helper 
*/ 

function chr_utf8_callback($matches) 
{ 
    return chr_utf8(hexdec($matches[1])); 
} 

/** 
* Multi-byte chr(): Will turn a numeric argument into a UTF-8 string. 
* 
* @param mixed $num 
* @return string 
*/ 

function chr_utf8($num) 
{ 
if ($num < 128) return chr($num); 
if ($num < 2048) return chr(($num >> 6) + 192) . chr(($num & 63) + 128); 
if ($num < 65536) return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128); 
if ($num < 2097152) return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128); 
return ''; 
} 


$string ="&#x201D;"; 

echo html_entity_decode_numeric($string); 

सुधार सुझावों का स्वागत है।

+0

हालांकि ' मान्य एचटीएमएल इकाई संदर्भ नहीं है, एक्सएमएल दस्तावेजों से "स्पिल ओवर" करना दुर्लभ नहीं है। पूरी तरह से पानी के सबूत होने के लिए निम्नलिखित जोड़ें: '$ string = str_ireplace ('''," '", $ string);' – Tilman

+2

एक और सुधार: इस कोड में एक भयानक स्मृति रिसाव है। प्रत्येक बार इसे create_function() के साथ बनाया गया नया लैम्ब्डा फ़ंक्शन कहा जाता है जो स्मृति में फंस जाता है। हां, preg_replace_callback() पर मैनुअल बताता है कि कोड को क्लीनर बनाने के लिए लैम्ब्डा फ़ंक्शन एक "शानदार विचार" है। लेकिन यह गलत है। एक साधारण असली फ़ंक्शन 'फ़ंक्शन chr_utf8_callback ($ मैचों) बनाने में कुछ भी गलत नहीं है { \t वापसी chr_utf8 (हेक्सडेक ($ मैचों [1])); } 'और इसके बजाय' $ string = preg_replace_callback ('~ & # x ([0-9a-fA-F] +); ~ i', chr_utf8_callback, $ string); 'मेमोरी लीक चला गया। – Tilman

+0

@ टिलमैन बहुत अच्छा मुद्दा, तय, धन्यवाद! –

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

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