我正在使用以下所有内容从我的数据库中取出一个名为“code”的字段,删除所有HTML实体,然后像往常一样将其打印到网站上:
<?php $code = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $code);
$code = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $code);
$code = html_entity_decode($code); ?>
但是导出的代码仍然如下所示:
progid:DXImageTransform.Microsoft.AlphaImageLoader(src=’img/the_image.png’);
看看那里发生了什么?我可以在字符串上运行多少其他东西将它们变成常规字符?!
谢谢!
杰克
答案 0 :(得分:4)
’
是您在读取UTF-8编码字符’
(右单引号,U + 2019)时获得的,就好像它被编码为windows-1252一样。换句话说,你有两个问题:你使用错误的编码来读错字符。
HTML属性值应该用ASCII撇号或引号括起来,而不是用引号括起来。您要转换的数字实体应为'
或'
(撇号)或"
或"
(引号)。相反,您似乎有’
,其代表与’
,’
或’
相同的字符。
至于第二个问题,结果文本似乎被编码为UTF-8,但在某些时候它被读取就好像它是windows-1252。在UTF-8中,字符’
由三字节序列E2 80 99
表示,但是windows-1252分别将每个字节转换为â
,€
和{ {1}}。无论发生在哪里,都不在你向我们展示的代码中。
好消息是您的™
代码似乎正常运行。 ;)但我认为其他人是正确的,他们说你可以单独使用preg_replace
。
答案 1 :(得分:0)
可能是您正在使用与您的页面不同的字符编码,ISO v.s.例如,UTF-8。
答案 2 :(得分:0)
chr仅适用于ASCII,因此您的非ASCII字符会变得混乱。除非我误解了你想要做的事情,否则只需要用正确的charset参数调用html_entity_decode(),就可以摆脱其他两行。
答案 3 :(得分:0)
虽然名称没有反映出来,但html_entity_decode
也会转换数字字符引用。
// α (U+03B1) == 0xCEB1 (UTF-8)
var_dump("\xCE\xB1" == html_entity_decode('α', ENT_COMPAT, 'UTF-8'));