我有一个类似这样的功能:
function replaceXMLEntities($subject) {
$subject = str_replace("&", "&", $subject);
$subject = str_replace("'", "'", $subject);
$subject = str_replace("<", "<", $subject);
$subject = str_replace(">", ">", $subject);
$subject = str_replace("\"", """, $subject);
return $subject;
}
此函数用于将字符串转换为xmpl编码的安全字符串。
但我有一个问题,其中一些xmpl数据ges编码2次,如
&
当imput到达
&&
就像在这里输入没有代码引用的文本一样:)
我需要一个可以区分&amp;的正则表达式和&amp;像
这样的东西if not & then do & -> & conversion else dont touch it.
知道我怎么能得到这样的正则表达式?我可以去做一个功能,但在这种情况下,正则表达式显然是一个更好的选择。
答案 0 :(得分:1)
首先用&
替换所有&
,您可以在没有正则表达式的情况下实现相同的目标:
$subject = str_replace("&", "&", $subject);
答案 1 :(得分:1)
$subject = preg_replace('#(?!&)&#', '&', $subject);
虽然使用htmlspecialchars()
可能会更容易......
答案 2 :(得分:0)
硬核方式:
preg_replace('/&(?!#?[a-z0-9]+;)/', '&', '& & < >');
简单而正确的方法是使用htmlspecialchars()
。
答案 3 :(得分:0)
使用preg_replace()
正则表达式 非常简单:
$subject = preg_replace('&(?!amp;)', '', $subject);
&
:匹配&
(?!amp;)
:否定前瞻,检查是否有amp;
我们仍然会将str_replace()
用于其他字符,但请注意它支持多个输入/替换,因此我们的最终代码将为:
function replaceXMLEntities($subject){
$subject = preg_replace('&(?!amp;)', '', $subject);
$subject = str_replace(array("'", '<', '>', '"'), array(''', '<', '>', '"'), $subject);
return $subject;
}
你也可以使用一种棘手的方法,首先用&
替换所有&
,然后用&
替换所有&
:
function replaceXMLEntities($subject){
return str_replace(array('&', '&', "'", '<', '>', '"'), array('&', '&', ''', '<', '>', '"'), $subject);
}