代码之家  ›  专栏  ›  技术社区  ›  Lyon

php输出xml产生解析错误“&rsquo

  •  5
  • Lyon  · 技术社区  · 16 年前

    有没有什么函数可以用来解析任何字符串,以确保它不会导致xml解析问题?我有一个php脚本输出一个xml文件,其中包含从表单获得的内容。

    问题是,除了php表单中常见的字符串检查之外,一些用户文本还会导致xml解析错误。我要面对这个” ’ “尤其是。这就是我犯的错误 Entity 'rsquo' not defined

    谢谢您!


    一些澄清: 我将表单中的内容输出到一个xml文件中,随后由javascript解析。

    我处理所有表格输入: htmlentities(trim($_POST['content']), ENT_QUOTES, 'UTF-8');

    当我想把这个内容输出到一个xml文件中时,我应该如何对它进行编码,这样它就不会抛出xml解析错误?

    到目前为止,以下两种解决方案有效:

    echo '<content><![CDATA['.$content.']]></content>';

    2) echo '<content>'.htmlspecialchars(html_entity_decode($content, ENT_QUOTES, 'UTF-8'),ENT_QUOTES, 'UTF-8').'</content>'."\n";

    谢谢,抱歉没有早点提供这个信息。

    7 回复  |  直到 16 年前
        1
  •  7
  •   Krab    16 年前

    你走错了路-不要找一个不会给你错误的解析器。相反,尝试使用格式良好的xml。

    你怎么弄到的 &rsquo; 来自用户?如果他按字面意思输入,则说明您没有正确处理输入—例如,您应该转义&到 &amp; . 如果是您将实体放在那里(也许代替了某些撇号),那么可以在DTD中定义它( <!ENTITY rsquo "&x2019;"> )或者用数字符号来写( &#x2019; ),因为几乎所有命名实体都是HTML的一部分。正如Gumbo指出的,XML只定义了一些基本的定义。

    根据问题的添加内容进行编辑:

    • 在#1中,如果用户键入 ]]> <°)))>< ,你有问题。
    • 解码应该是没有必要的(如果你不希望用户发布像 &amp;

    how Drupal does it .

        2
  •  4
  •   Joseph    16 年前

    将值括在CDATA标记中。

    <message><![CDATA[&rsquo;]]></message>
    

    从 w3schools site

    “<”将生成错误,因为解析器将其解释为新元素的开头。

    “&”将生成错误,因为解析器将其解释为字符实体的开头。

    某些文本(如JavaScript代码)包含大量“<”或“&”角色。为了避免错误,脚本代码可以定义为CDATA。

    解析器将忽略CDATA节中的所有内容。

        3
  •  4
  •   da5id    12 年前
    html_entity_decode($string, ENT_QUOTES, 'UTF-8')
    
        4
  •  3
  •   porges    16 年前

    问题是你的 htmlentities 函数正在做它应该做的事情-从字符生成HTML实体。然后将它们插入到一个没有定义HTML实体的XML文档中(比如 &rsquo; 是特定于HTML的)。

    处理这个问题的最简单方法是保持所有输入都是原始的(即不要用

    这将确保所有文本都正确编码,并且XML格式良好。

    $user_input = "...<>&'";
    
    $doc = new DOMDocument('1.0','utf-8');
    
    $element = $doc->createElement("content");
    $element->appendChild($doc->createTextNode($user_input));
    
    $doc->appendChild($element);
    
        5
  •  1
  •   Ford    10 年前

    我遇到了一个类似的问题,我需要添加到XML中的数据已经由我的代码以htmlentities()的形式返回(不是像这样在数据库中)。

    我用过:

    $doc = new DOMDocument('1.0','utf-8');    
    $element = $doc->createElement("content");    
    $element->appendChild($doc->createElement('string', htmlspecialchars(html_entity_decode($string, ENT_QUOTES, 'UTF-8'), ENT_XML1, 'UTF-8')));
    $doc->appendChild($element);
    

    或者如果它还不在htmlentities()中

    $doc = new DOMDocument('1.0','utf-8');
    
    $element = $doc->createElement("content");       
    $element->appendChild($doc->createElement('string', htmlspecialchars($string, ENT_XML1, 'UTF-8')));
    $doc->appendChild($element);
    

    基本上,在entxml1中使用htmlspecialchars应该可以将用户输入的数据转换成XML安全的数据(对我来说很好):

    htmlspecialchars($string, ENT_XML1, 'UTF-8');
    
        7
  •  0
  •   Mukesh Joshi    5 年前

    这对我有用。有人面对同样的问题可以试试这个。

    htmlentities($string, ENT_XML1)

    特殊字符转换。

    htmlspecialchars(htmlentities($string, ENT_XML1))

        8
  •  -1
  •   tfont    10 年前
    htmlspecialchars($trim($_POST['content'], ENT_XML1, 'UTF-8');