【问题标题】:Turning HTML character entities to 'regular' letters... why is it only partially working?将 HTML 字符实体转换为“常规”字母......为什么它只能部分工作?
【发布时间】:2010-03-01 21:55:48
【问题描述】:

我正在使用以下所有内容从我的数据库中获取一个名为“代码”的字段,删除所有 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’);

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

谢谢!

杰克

【问题讨论】:

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


    【解决方案1】:

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

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

    至于第二个问题,生成的文本似乎被编码为 UTF-8,但在某些时候它被读取为好像是 windows-1252。在 UTF-8 中,字符 由三字节序列 E2 80 99 表示,但 windows-1252 将每个字节分别转换为 â。无论发生在哪里,它都不会出现在您向我们展示的代码中。

    好消息是您的preg_replace 代码似乎工作正常。 ;) 但我认为其他人说你可以单独使用 html_entity_decode() 时是对的。

    【讨论】:

      【解决方案2】:

      可能是您使用的字符编码与您的页面不同,ISO vs.例如 UTF-8。

      【讨论】:

        【解决方案3】:

        chr 仅适用于 ASCII,因此您的非 ASCII 字符会变得混乱。除非我误解了您要执行的操作,否则您只需要使用正确的字符集参数一次调用 html_entity_decode() 即可,并且可以摆脱其他两行。

        【讨论】:

          【解决方案4】:

          虽然名称没有反映出来,html_entity_decode 也确实转换了数字字符引用。

          // α (U+03B1) == 0xCEB1 (UTF-8)
          var_dump("\xCE\xB1" == html_entity_decode('&#x03B1;', ENT_COMPAT, 'UTF-8'));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-04
            • 1970-01-01
            • 1970-01-01
            • 2021-12-09
            • 1970-01-01
            • 2010-12-30
            • 2023-03-30
            • 2017-07-04
            相关资源
            最近更新 更多