PHP sayısal HTML varlıkları çözmek için nasıl

3 Cevap php

Ben dizeye sayısal işletmeden kodlanmış uzun çizgi çözmek için çalışıyorum, ama ben düzgün yapabilirim bir işlevi bulamıyorum görünüyor.

Ben buldum iyi (), ancak, nedense uzun çizgi ve diğer bazı özel karakterleri çözmek için başarısız mb_decode_numericentity olduğunu.

$str = '–';

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

Bu dönecektir "?".

Herkes bu sorunu çözmek için nasıl bilir?

3 Cevap

(Çoğunlukla here ve geliştirilmiş çalınan) Aşağıdaki kod parçası değişmez, sayısal onluk ve sayısal hexa-ondalık varlıkları için çalışacak:

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);

İyileştirme önerileri bekliyoruz.

8211 ondalık Unicode karakter kodu noktasıdır. Onaltılık, bu 2013 bulunuyor.

$str = '\u2013';

mb_decode_numericentity sadece ondalık, onaltılık işlemez. Eğer ile beklenen sonuç elde edersiniz:

$str = '–';

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

Sen hexdec ondalık için onaltılık dönüştürmek için kullanabilirsiniz.

Ayrıca, meraktan, aşağıdaki çalışma yapar:

$str = '&#8211;';

 $str = html_entity_decode($str);