1

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

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 数据被编码 2 次,比如

&amp;

输入到

&&amp;

就像在此处输入没有代码引号的文本时一样:)

我需要一个可以区分 & 和 & 之类的正则表达式

if not &amp then do & -> &amp; conversion else dont touch it. 

知道如何实现这样的正则表达式吗?我可以去做一个功能,但在这种情况下,正则表达式显然是一个更好的选择。

4

4 回答 4

1

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

Though using htmlspecialchars() might be easier...

于 2013-06-27T13:50:27.077 回答
1

&amp您可以通过将所有s替换为&first来实现相同的效果,而无需使用正则表达式:

$subject = str_replace("&amp;", "&", $subject);
于 2013-06-27T13:43:34.160 回答
0

使用正则表达式非常简单:preg_replace()
$subject = preg_replace('&(?!amp;)', '', $subject);

&: match &                                                (?!amp;): Negative lookahead, 检查是否有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);
}
于 2013-06-27T14:15:51.623 回答
0

硬核方式:

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

简单而正确的方法是使用htmlspecialchars().

于 2013-06-27T14:02:45.270 回答