正则表达式替换PHP中的ambersands而不是<script>标签</script>

时间:2011-06-24 10:25:42

标签: php regex

我有这样的功能:

function parser($buffer){
    $buffer = preg_replace('/&(?![#]?[a-z0-9]+;)/i', "&amp;$1", $buffer);
    return $buffer;
}

它的作用是替换输出中的所有&符号(&符号),&amp;用于xhtml验证。我遇到的问题是<script>标签内的&符也会被转换。无论如何,我可以忽略<script>标签内的&符号,以便它们不会被转换?还有其他方法可以实现这个目标吗?

3 个答案:

答案 0 :(得分:0)

$buffer = preg_replace("/((<[^>]*)|&)/e", '"\2"=="\1"? "\1":"&amp;"', $buffer);

答案 1 :(得分:0)

好的,经过大量的搜索,我找到了答案:

    preg_replace('/&(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)(?!(?>(?:(?!<script|\/script>).)*)\/script>)/s', "&amp;$1", $text);

正则表达式基于this thread,但使用脚本标记而不是cdata。我想我应该发布它,因为有人可能会发现这个小解析器很有用。

答案 2 :(得分:0)

&(?!(?<=(?<outerquote>["'])javascript:(?>(?!\k<outerquote>|[>]).)*)\k<outerquote>?)(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)(?!(?>(?:(?!<script|\/script>).)*)\/script>)

这将与&amp;只在脚本标签之外..它也会忽略锚点内的匹配,其中包含javascript代码。

很好找到“Samplist”...我需要它在JavaScript链接中工作,如

<a href="javascript:alert('& & &');">Will correct this & but ignore those in the javascript:</a>
<script src="blaw.aspx?a=b&c=d" /><!-- want the Src to be corrected -->
<script type="text/javascript">
    function SomeFunction(){if (a=b) && (c=d){ IgnoreTheAmpsInIFWithinScript();}
</script>
&#123; is ignored but & is corrected