将HTML字符实体转换为“常规”字母...为什么它只是部分工作?

时间:2010-03-01 21:55:48

标签: php html regex character-encoding character-entities

我正在使用以下所有内容从我的数据库中取出一个名为“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’);

看看那里发生了什么?我可以在字符串上运行多少其他东西将它们变成常规字符?!

谢谢!

杰克

4 个答案:

答案 0 :(得分:4)

’是您在读取UTF-8编码字符(右单引号,U + 2019)时获得的,就好像它被编码为windows-1252一样。换句话说,你有两个问题:你使用错误的编码来读错字符。

HTML属性值应该用ASCII撇号或引号括起来,而不是用引号括起来。您要转换的数字实体应为&#39;&#x27(撇号)或&#34;&#x22;(引号)。相反,您似乎有&#146;,其代表与&#x2019;&#8217&rsquo;相同的字符。

至于第二个问题,结果文本似乎被编码为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('&#x03B1;', ENT_COMPAT, 'UTF-8'));