Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 以及你是否关心黑客故意发送格式不正确的XML。_Php_Xml_Tinymce_Entity_Simplexml - Fatal编程技术网

Php 以及你是否关心黑客故意发送格式不正确的XML。

Php 以及你是否关心黑客故意发送格式不正确的XML。,php,xml,tinymce,entity,simplexml,Php,Xml,Tinymce,Entity,Simplexml,我同意这纯粹是一个编码问题。在PHP中,我就是这样解决这个问题的: 在将html片段传递给simplexmlement构造函数之前,我使用html\u entity\u decode对其进行了解码 然后使用utf8\u encode()对其进行进一步编码 $headerDoc=''。utf8_编码(html_实体_解码($headerFragment))。'; $xmlHeader=新的SimpleXMLElement($headerDoc); 现在,上面的代码不会抛出任何未定义的实体错误。对

我同意这纯粹是一个编码问题。在PHP中,我就是这样解决这个问题的:

  • 在将html片段传递给
    simplexmlement
    构造函数之前,我使用
    html\u entity\u decode对其进行了解码

  • 然后使用
    utf8\u encode()
    对其进行进一步编码

  • $headerDoc=''。utf8_编码(html_实体_解码($headerFragment))。';
    $xmlHeader=新的SimpleXMLElement($headerDoc);
    

    现在,上面的代码不会抛出任何未定义的实体错误。

    对于任何解析XML或JSON的语言(基本上,每种语言)来说,这个问题都是一个普遍的问题

    上面的答案是针对PHP的,但是Perl解决方案就像

    my $excluderegex =
        '^\n\x20-\x20' .   # Don't Encode Spaces
           '\x30-\x39' .   # Don't Encode Numbers
           '\x41-\x5a' .   # Don't Encode Capitalized Letters
           '\x61-\x7a' ;   # Don't Encode Lowercase Letters
    
        # in case anything is already encoded
    $value = HTML::Entities::decode_entities($value);
    
        # encode properly to numeric
    $value = HTML::Entities::encode_numeric($value, $excluderegex);
    
    使用带有标志“entxml1”的“htmlentities()”:
    htmlentities($value,entxml1)

    如果使用“SimpleXMLElement”类:


    $simplexmlement->addChild($name,htmlentities($value,ENT_XML1))

    问题的某些重要部分是不可见的,因为它们被解析为标记。请用反引号(```)将这些位括起来。@LarsH:Hm,我在问题源中没有看到任何需要这个的地方。@Tomalak:“1.我可以找到并替换所有的??并用??或实际的空格替换掉它们。”在我看来,确实缺少了一些东西。@LarsH:哦,你说得对。我没有注意到这些。您只需再做几次代表,就可以自己编辑问题了。:)好的,如果您应用“$content=preg_replace_callback('/&([\w\d]+);/i',“\u convertAlphaEntitysToNumericEntitys',$content);”所有HTML实体(以及其他)都将更改为数字实体。然后应用“$content=preg\u replace\u callback('/[^\w\d]/i',“\u convertascover127tonumericintys'),$content);”并将127以上的每个字符(不是由htmlspecialchars处理的)转换为数字实体,如果我理解错误,请给出一个输入示例片段好吗?抱歉,我误解了你的代码。删除我之前的评论。@Tomalak-为什么ö;成为&;哎哟;?当文本被放入innerhtml时,它不会作为单个字符o-umlaut?1被解析到dom中。可能会有太多的开销,对吗?2.再想一想,这似乎适得其反,所以我要取消这个选项。3.除了文件更大,还有其他缺点吗?如果不是的话,我会说这就是出路。4.是的,那将违反要求。5.我不明白这个解决方案-你能提供更多细节吗-兰特谢谢你这么做!3.问题是:替换这些值或嵌入检查实体的DTD会花费更多的处理器时间吗?5.好的,我现在明白了。我想在服务器上执行此操作-Ryan@Ryan-自己替换值可能更快,因为DTD处理更通用。但您必须测试它才能确定。“您可以用HTML解析文本,并用相应的数字实体重新转义”——这是否意味着您可以始终将数字实体存储在HTML文本实体之上-Ryan@Ryan:是的,数字实体在XML和HTML中都是允许的(并且可以被识别)。@Tomalak这意味着我必须事先知道所有实体的名称及其数字实体,对吗?如果我把它们都加进去的话,这会是一个非常密集的处理过程吗-Ryan@Ryan:有些函数知道所有实体名称,您不必手动执行。这就是我所说的“HTML解析”。使用HTML解析器进行此类工作。@Tomalak在您的一段文章中,您建议您可以存储实际字符,因此从技术上讲,在将其写入XML文件之前,我是否可以使用HTML_entity_decode获取字符-如果将
    “UTF-8”
    作为第三个参数,例如
    html\u实体解码($headerFragment,null,“UTF-8”)
    myDiv.innerHTML = myField.value;
    
    my $excluderegex =
        '^\n\x20-\x20' .   # Don't Encode Spaces
           '\x30-\x39' .   # Don't Encode Numbers
           '\x41-\x5a' .   # Don't Encode Capitalized Letters
           '\x61-\x7a' ;   # Don't Encode Lowercase Letters
    
        # in case anything is already encoded
    $value = HTML::Entities::decode_entities($value);
    
        # encode properly to numeric
    $value = HTML::Entities::encode_numeric($value, $excluderegex);