note 57167 added to function.html-entity-decode
| From: | emilianomartinezluque at yahoo dot com | Date: | Mon, 26 Sep 2005 00:22:32 +0000 |
| Subject: | note 57167 added to function.html-entity-decode | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-95777@lists.php.net to get a copy of this message | ||
I've been using the great replace_num_entity function posted below. But there seems to be some
problems with the 128 to 160 characters range. Ie, try:
<?php header("Content-type: text/html; charset=utf-8"); ?>
<html><body>
<?php
for($x=128; $x<161; $x++) {
echo('&#' . $x . '; -- ' .
preg_replace_callback('/&#([0-9a-fx]+);/mi', 'replace_num_entity',
'&#' . $x . ';') . '</br>');
}
?>
</body></html>
I really don´t know the reason for this (since according to UTF-8 specs the function should have
worked) but I did a modified version of the function to address this. Hope it helps.
function replace_num_entity($ord)
{
$ord = $ord[1];
if (preg_match('/^x([0-9a-f]+)$/i', $ord, $match))
{
$ord = hexdec($match[1]);
}
else
{
$ord = intval($ord);
}
$no_bytes = 0;
$byte = array();
if($ord == 128) {
return chr(226).chr(130).chr(172);
} elseif($ord == 129) {
return chr(239).chr(191).chr(189);
} elseif($ord == 130) {
return chr(226).chr(128).chr(154);
} elseif($ord == 131) {
return chr(198).chr(146);
} elseif($ord == 132) {
return chr(226).chr(128).chr(158);
} elseif($ord == 133) {
return chr(226).chr(128).chr(166);
} elseif($ord == 134) {
return chr(226).chr(128).chr(160);
} elseif($ord == 135) {
return chr(226).chr(128).chr(161);
} elseif($ord == 136) {
return chr(203).chr(134);
} elseif($ord == 137) {
return chr(226).chr(128).chr(176);
} elseif($ord == 138) {
return chr(197).chr(160);
} elseif($ord == 139) {
return chr(226).chr(128).chr(185);
} elseif($ord == 140) {
return chr(197).chr(146);
} elseif($ord == 141) {
return chr(239).chr(191).chr(189);
} elseif($ord == 142) {
return chr(197).chr(189);
} elseif($ord == 143) {
return chr(239).chr(191).chr(189);
} elseif($ord == 144) {
return chr(239).chr(191).chr(189);
} elseif($ord == 145) {
return chr(226).chr(128).chr(152);
} elseif($ord == 146) {
return chr(226).chr(128).chr(153);
} elseif($ord == 147) {
return chr(226).chr(128).chr(156);
} elseif($ord == 148) {
return chr(226).chr(128).chr(157);
} elseif($ord == 149) {
return chr(226).chr(128).chr(162);
} elseif($ord == 150) {
return chr(226).chr(128).chr(147);
} elseif($ord == 151) {
return chr(226).chr(128).chr(148);
} elseif($ord == 152) {
return chr(203).chr(156);
} elseif($ord == 153) {
return chr(226).chr(132).chr(162);
} elseif($ord == 154) {
return chr(197).chr(161);
} elseif($ord == 155) {
return chr(226).chr(128).chr(186);
} elseif($ord == 156) {
return chr(197).chr(147);
} elseif($ord == 157) {
return chr(239).chr(191).chr(189);
} elseif($ord == 158) {
return chr(197).chr(190);
} elseif($ord == 159) {
return chr(197).chr(184);
} elseif($ord == 160) {
return chr(194).chr(160);
}
if ($ord < 128)
{
return chr($ord);
}
elseif ($ord < 2048)
{
$no_bytes = 2;
}
elseif ($ord < 65536)
{
$no_bytes = 3;
}
elseif ($ord < 1114112)
{
$no_bytes = 4;
}
else
{
return;
}
switch($no_bytes)
{
case 2:
{
$prefix = array(31, 192);
break;
}
case 3:
{
$prefix = array(15, 224);
break;
}
case 4:
{
$prefix = array(7, 240);
}
}
for ($i = 0; $i < $no_bytes; $i++)
{
$byte[$no_bytes - $i - 1] = (($ord & (63 * pow(2, 6 * $i))) / pow(2, 6 * $i)) &
63 | 128;
}
$byte[0] = ($byte[0] & $prefix[0]) | $prefix[1];
$ret = '';
for ($i = 0; $i < $no_bytes; $i++)
{
$ret .= chr($byte[$i]);
}
return $ret;
}
----
Manual Page -- http://www.php.net/manual/en/function.html-entity-decode.php
Edit -- http://master.php.net/manage/user-notes.php?action=edit+57167
Delete: added to the manual -- http://master.php.net/manage/user-notes.php?action=delete+57167&report=yes&reason=added+to+the+manual
Delete: bad code -- http://master.php.net/manage/user-notes.php?action=delete+57167&report=yes&reason=bad+code
Delete: spam -- http://master.php.net/manage/user-notes.php?action=delete+57167&report=yes&reason=spam
Delete: useless -- http://master.php.net/manage/user-notes.php?action=delete+57167&report=yes&reason=useless
Delete: non-english -- http://master.php.net/manage/user-notes.php?action=delete+57167&report=yes&reason=non-english
Delete: already in docs -- http://master.php.net/manage/user-notes.php?action=delete+57167&report=yes&reason=already+in+docs
Delete: other reasons -- http://master.php.net/manage/user-notes.php?action=delete+57167&report=yes
Reject -- http://master.php.net/manage/user-notes.php?action=reject+57167&report=yes
Search -- http://master.php.net/manage/user-notes.php