我有这样的功能:
function parser($buffer){
$buffer = preg_replace('/&(?![#]?[a-z0-9]+;)/i', "&$1", $buffer);
return $buffer;
}
它的作用是替换输出中的所有&符号(&
符号),&
用于xhtml验证。我遇到的问题是<script>
标签内的&符也会被转换。无论如何,我可以忽略<script>
标签内的&符号,以便它们不会被转换?还有其他方法可以实现这个目标吗?
答案 0 :(得分:0)
$buffer = preg_replace("/((<[^>]*)|&)/e", '"\2"=="\1"? "\1":"&"', $buffer);
答案 1 :(得分:0)
好的,经过大量的搜索,我找到了答案:
preg_replace('/&(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)(?!(?>(?:(?!<script|\/script>).)*)\/script>)/s', "&$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>
{ is ignored but & is corrected