如何清理包含有效UTF8字符的XML属性的表单字段?

Par*_*ris 6 php xml sanitization

我一直在努力解决这个问题.我有一个多语言的Web应用程序,在某些时候输出XML.这个XML可以包含任何语言,因此我的清理方法是禁止某些破坏XML的字符被插入.我尽可能多地在CDATA中包装,但我在属性中有很多内容.我不想禁用特殊字符,因为括号,句号,短划线,刻度和撇号等完全有效的字符始终使用并且它们起作用.

去除所有会破坏XML属性的字符的最佳方法是什么,但保留语言完整?

更新:
我发现:http://en.wikipedia.org/wiki/CDATA#CDATA-type_attribute_value,它向我表明我可以使用DTD将属性描述为CDATA部分; 然而,这似乎并非如此.

<?xml version="1.0" ?> 
<!DOCTYPE foo [
  <!ELEMENT foo EMPTY>
  <!ATTLIST foo a CDATA #REQUIRED>
]>
<foo a="&bull;"><![CDATA[ &bull; ]]> </foo>
Run Code Online (Sandbox Code Playgroud)

任何验证者都会抱怨公牛不是该属性中的实体.如果删除该属性,它将有效.另外我听说模式是要走的路,所以如果像上面这样的东西是可能的,而是使用XML Schema,那就太棒了.

谢谢!

neu*_*rah 2

这是有效的

<?xml version="1.0" ?> 
<!DOCTYPE foo [
  <!ELEMENT foo EMPTY>
  <!ATTLIST foo a CDATA #REQUIRED>
]>
<foo a="&amp;bull;"><![CDATA[ &bull; ]]> </foo>
Run Code Online (Sandbox Code Playgroud)

您可以将特殊字符转换为 html 实体

htmlentities($str);
Run Code Online (Sandbox Code Playgroud)

并反转

html_entity_decode($str);
Run Code Online (Sandbox Code Playgroud)

请参阅: http: //www.php.net/manual/en/function.htmlentities.php

另请参阅“html 元字符”