条件字符串替换

时间:2013-06-27 13:36:31

标签: php xml regex character-encoding xml-parsing

我有一个类似这样的功能:

function replaceXMLEntities($subject) {
 $subject = str_replace("&", "&", $subject);
 $subject = str_replace("'", "'", $subject);
 $subject = str_replace("<", "&lt;", $subject);
 $subject = str_replace(">", "&gt;", $subject);
 $subject = str_replace("\"", "&quot;", $subject);

 return $subject;
}

此函数用于将字符串转换为xmpl编码的安全字符串。

但我有一个问题,其中一些xmpl数据ges编码2次,如

&amp;

当imput到达

&&amp;

就像在这里输入没有代码引用的文本一样:)

我需要一个可以区分&amp;的正则表达式和&amp;像

这样的东西
if not &amp then do & -> &amp; conversion else dont touch it. 

知道我怎么能得到这样的正则表达式?我可以去做一个功能,但在这种情况下,正则表达式显然是一个更好的选择。

4 个答案:

答案 0 :(得分:1)

首先用&amp替换所有&,您可以在没有正则表达式的情况下实现相同的目标:

$subject = str_replace("&amp;", "&", $subject);

答案 1 :(得分:1)

$subject = preg_replace('#(?!&amp;)&#', '&amp;', $subject);

虽然使用htmlspecialchars()可能会更容易......

答案 2 :(得分:0)

硬核方式:

preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', '&amp; & &lt; &gt;');

简单而正确的方法是使用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('&apos;', '&lt;', '&gt;', '&quot;'), $subject);

    return $subject;
}

你也可以使用一种棘手的方法,首先用&amp;替换所有&,然后用&替换所有&amp;

function replaceXMLEntities($subject){
    return str_replace(array('&amp;', '&', "'", '<', '>', '"'), array('&', '&amp;', '&apos;', '&lt;', '&gt;', '&quot;'), $subject);
}