如何使用preg_替换外部<;脚本></脚本>;在php中

如何使用preg_替换外部<;脚本></脚本>;在php中,php,preg-replace,Php,Preg Replace,我有一根绳子: $source = '& <script type="text/javascript">&</script> & <script type="text/javascript">&</script> &'; $source = '& <script type="text/javascript">text&text</script> & <s

我有一根绳子:

$source = '&
<script type="text/javascript">&</script>
&
<script type="text/javascript">&</script>
&';
$source = '&
<script type="text/javascript">text&text</script>
&
<script type="text/javascript">&</script>
&';
$source=&
&
&
&
&';
预期的结果是:

&amp;
<script type="text/javascript">&</script>
&amp;
<script type="text/javascript">&</script>
&amp;
&amp;
<script type="text/javascript">text&text</script>
&amp;
<script type="text/javascript">&</script>
&amp;
&;
&
&;
&
&;
我尝试:

echo preg_replace("#&(?!amp;)(?!<\/script>)(?![^<]script.*?>)#i",
                  "&amp;", $source);
echo preg#u replace(“#&(?amp;)(?!)(?![^)#i”,
“&;”,$source);
但我只能替换第一个“&”,否则它们都被替换了

我怎样才能得到这个结果

编辑1:

现在如果我有一个字符串:

$source = '&
<script type="text/javascript">&</script>
&
<script type="text/javascript">&</script>
&';
$source = '&
<script type="text/javascript">text&text</script>
&
<script type="text/javascript">&</script>
&';
$source=&
文本&文本
&
&
&';
预期的结果是:

&amp;
<script type="text/javascript">&</script>
&amp;
<script type="text/javascript">&</script>
&amp;
&amp;
<script type="text/javascript">text&text</script>
&amp;
<script type="text/javascript">&</script>
&amp;
&;
文本&文本
&;
&
&;

使用
g
修饰符全局替换匹配项(每次出现)

echo preg\u replace(“#&(?amp;)(?!)(?![^)#ig”,
“&;”,$source);

使用
g
修饰符全局替换匹配项(每次出现)

echo preg\u replace(“#&(?amp;)(?!)(?![^)#ig”,
“&;”,$source);
试试这个

$output = preg_replace("/&(?!amp;)(?!<\/script>)(?![^<]script.*?>)/", "&amp;", $source);
$output=preg_replace(“/&(?amp;)(?!)(?![^)/”,“&;”,$source);
试试这个

$output = preg_replace("/&(?!amp;)(?!<\/script>)(?![^<]script.*?>)/", "&amp;", $source);
$output=preg_replace(“/&(?amp;)(?!)(?![^)/”,“&;”,$source);

请停止使用正则表达式。我再也受不了了。我的头很痛,但只是因为我把它砸在桌子上了


我建议使用或解析字符串,然后在每个非脚本标记之间循环,对每个符号进行编码。

请停止使用正则表达式。我再也受不了了。我的头很痛,但只是因为我把它砸在桌子上了



我建议使用或来解析字符串,然后循环遍历每个非脚本标记来编码每个符号。

为什么需要对可能包含标记的内容进行编码?如果这是用户输入,那么您会对各种各样的XSS不好之处敞开大门。我使用Yahoo Yui的库和“post request”在XmlHttpRequest for datasources不起作用中,为什么需要对可能包含标记的内容进行编码?如果这是用户输入,那么您会对各种各样的XSS不好之处敞开大门。我使用Yahoo Yui的库和XmlHttpRequest for datasources不起作用中的“post请求”:preg_replace()[函数.preg replace]:未知修饰符“g”不起作用:preg_replace()[function.preg replace]:未知修饰符“g”@Kevin-我在我的服务器上试用过,效果和你预期的一样。你使用的是什么版本?我发现它怎么不起作用,我已经更新了我的问题。我添加了“文本和文本”。当“&”在其他字符之间,正则表达式不起作用。好的,我找到了我最后一条评论的答案。它是“/^&(?!amp;)(?![^)(?!)/”@Kevin-我在我的服务器上试用了它,它能如你所愿工作。你使用的是什么版本?我发现它不起作用,我已经更新了我的问题。我添加了“文本和文本”。当“&”在其他字符之间,正则表达式不起作用。好的,我找到了我最后一条评论的答案。它是“/^&(?!amp;)(?![^)(?!)/”我完全理解你的意思,我计划使用XSLT,但现在我不得不使用这种情况……对不起你的头;)@Christina Toma为什么不呢?如果它像他显示的那样小,那么它将需要最小的解析处理。但是,如果字符串变大(其可能性与开发人员坚持认为不会发生的程度成反比),那么这个解决方案将可以很好地扩展。而dev希望以后使用什么并维护regex?@Lucas-但是为什么不使用公认答案中提供的regex,它比所有DOMDocument处理都快?在您看来,使用DOMDocument有什么好处?@Christina Toma我已经在我的pr中列出了一些很好的理由之前的评论,但这里有几个具体的例子:如果他后来决定他也想摆脱尖括号呢?或者如果他决定他也想跳过嵌入标记呢?在一个大型应用程序中,可维护性和可伸缩性远比微不足道的性能改进更重要。@Lucas-关于mai,你是绝对正确的无能力和可扩展性,但速度在大型应用程序中也非常重要。我完全理解您的意思,我计划使用XSLT,但现在我不得不使用这种情况……对不起,您的头;)@Christina Toma为什么不呢?如果它像他展示的那样小,那么解析时需要最少的处理。但是,如果字符串增长(增长的可能性与开发人员坚称不会发生的程度成反比),那么这个解决方案将可以很好地扩展。而dev希望以后使用什么并维护regex?@Lucas-但是为什么不使用公认答案中提供的regex,它比所有DOMDocument处理都快?在您看来,使用DOMDocument有什么好处?@Christina Toma我已经在我的pr中列出了一些很好的理由之前的评论,但这里有几个具体的例子:如果他后来决定他也想摆脱尖括号呢?或者如果他决定他也想跳过嵌入标记呢?在一个大型应用程序中,可维护性和可伸缩性远比微不足道的性能改进更重要。@Lucas-关于mai,你是绝对正确的它具有灵活性和可扩展性,但在大型应用程序中,速度也非常重要。