如何使用php转换xml中的特殊字符?

时间:2014-12-31 12:38:22

标签: php xml html5

这个问题有很多帖子。我已经完成了所有这些但是我没有像我预期的那样得到解决方案。我需要将XML中的特殊字符转换为html实体。

我试过了,

<?php
$xml="<test>This is a xml file which has special characters < > & in it</test>";
htmlspecialchars($xml, ENT_XML1, 'UTF-8');//it replaces xml tags too
?>

预期输出XML字符串:

<test>This is a xml file which has special characters &lt; $gt; &amp; in it</test>

1 个答案:

答案 0 :(得分:1)

  

这个问题有很多帖子。我已经完成了所有这些,但我没有像我预期的那样得到解决方案。

是的,您认为您所询问的主题已明确定义,并且已在本网站上进行了详细介绍。但是,这并不能防止出错,因为它恰好是白天最好用的。

您在代码示例中写道:

  

这是一个包含特殊字符的xml文件

你给出以下字符串:

<test>This is a xml file which has special characters < > & in it</test>

但你写的是错的。这是 XML文件,因为它不是well-formed

所以这是第一个发生的错误。

你的问题中的下一个错误是你在整个字符串上应用转换函数,虽然你只想在字符串的一小部分上应用它,即这三个字符:

  1. <抵消54
  2. >在偏移56处(技术上这是not need to become &gt;
  3. &抵消58
  4. 所以你 只需要在这些部分上应用这个功能。只是一个示例代码来证明这一点,你不应该把它作为一个&#34;解决方案&#34;,这是为了演示:

    foreach ([58, 56, 54] as $offset)
    {
        $encoded = htmlspecialchars($xml[$offset], ENT_XML1, 'UTF-8');
        $xml = substr_replace($xml, $encoded, $offset, 1);
    }
    

    正如此示例所示,您选择的编码功能并非完全错误,它正确编码了您要求的字符:

    <test>This is a xml file which has special characters &lt; &gt; &amp; in it</test>
    

    (还有其他可以想象的方式,例如使用CData部分<test><![CDATA[This is a xml file which has special characters < > & in it]]></test>,但这不是重点。)

    然而,由于所有这些错误以及这造成的混乱,并不意味着在Stackoverflow上我们不会有现有的Q&amp; A材料明确地解决这个问题。

    通过识别所犯的错误来消除困惑,有一个参考资料的曲目,您可以从中选择您的武器:

    正如您所看到的,有一个更大的问题和答案列表,并且根据第一个分析,您的XML存在哪些错误,而不是XML,但可能会因为它在视觉上关闭而成为XML对它来说,你应该能够找到一种你最喜欢修复它的方法。

    我个人是Tidy extension in PHP的粉丝,可以帮助你完成你的工作:

    tidy_repair_string($xml, ['input-xml' => 1, 'output-xml' => 1, 'wrap' => 0]);
    

    您可能希望采用不同的方式。请参阅上面的关联问题,作为更好的搜索字词的开头,并查看其他人对此主题的询问和回答。