/**
* @param $arr1 the single string that shall be masked
* @return the resulting string with the masked characters
*/
function replace_char($arr1)
{
if (strpos ($arr1,'&')!== FALSE) { //test if the character appears
$arr1=preg_replace('/&/','&', $arr1); // do this first
}
// just encode the
if (strpos ($arr1,'>')!== FALSE) {
$arr1=preg_replace('/>/','>', $arr1);
}
if (strpos ($arr1,'<')!== FALSE) {
$arr1=preg_replace('/</','<', $arr1);
}
if (strpos ($arr1,'"')!== FALSE) {
$arr1=preg_replace('/"/','"', $arr1);
}
if (strpos ($arr1,'\'')!== FALSE) {
$arr1=preg_replace('/\'/',''', $arr1);
}
return $arr1;
}
10 回答
使用DOM类生成整个XML文档 . 它将处理我们甚至不想关心的编码和解码 .
编辑:这被@Tchalvak批评:
哪个错了,DOMDocument可以正确输出一个片段而不是整个文档:
这使:
如:
见Demo
我创建了一个简单的函数,它与XML中的five "predefined entities"一起转义:
用法示例Demo:
输出:
使用
str_replace
可以实现类似的效果,但由于双重替换(未经测试,不推荐),它很脆弱:htmlspecialchars()功能怎么样?
Note:
ENT_XML1
标志仅在PHP 5.4.0或更高版本可用时才可用 .带有这些参数的
htmlspecialchars()
将替换以下字符:&
(&符号)变为&
"
(双引号)变为"
'
(单引号)变为'
<
(小于)变为<
>
(大于)变为>
您可以使用get_html_translation_table()函数获取转换表 .
试图处理XML实体问题,以这种方式解决:
为了获得有效的最终XML文本,您需要转义所有XML实体,并使用与XML文档处理指令相同的编码来编写文本(
<?xml
行中的"encoding") . 只要将重音字符编码为文档,就不需要对其进行转义 .但是,在许多情况下,简单地使用
htmlspecialchars
转义输入可能会导致双重编码实体(例如é
将变为&eacute;
),因此我建议首先解码html实体:现在,您需要确保所有重音字符在XML文档编码中都有效 . 我强烈建议始终以UTF-8编码XML输出,因为并非所有XML解析器都遵循XML文档处理指令编码 . 如果您的输入可能来自不同的字符集,请尝试使用
utf8_encode()
.有一个特殊情况,你的输入可能来自以下编码之一:ISO-8859-1,ISO-8859-15,UTF-8,cp866,cp1251,cp1252和KOI8-R - PHP将它们全部视为同样,但它们之间存在一些细微的差别 - 其中一些甚至
iconv()
无法处理 . 我只能通过补充utf8_encode()
行为来解决这个编码问题:如果你需要正确的xml输出,simplexml是要走的路:
http://www.php.net/manual/en/simplexmlelement.asxml.php
正确转义是获取正确XML输出的方法,但您需要处理Java code和 elements 的转义 differently . (这是托马斯的回答是不正确的) .
我写了/偷了一些Java code,后来区分属性和元素转义 . 原因是XML解析器特别在属性中考虑所有空白区域 .
将它移植到PHP应该是微不足道的(如果你使用
UTF-8
,你可以使用Tomas Jancik 's approach with the above appropriate escaping). You don' t担心转义扩展实体 .如果您不想移植我的Java代码,您可以查看基于流的XMLWriter并使用libxml,因此它应该非常高效 .
您可以使用此方法:http://php.net/manual/en/function.htmlentities.php
这样,所有实体(html / xml)都被转义,您可以将字符串放在XML标记中
根据sadeghj的解决方案,以下代码适用于我: