为什么这个php正则表达式程序崩溃

时间:2015-11-24 14:36:46

标签: php regex crash expression

  

这是代码

 <?php 
//here is the string
$str ="<style>
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
  .a{color: red;}
</style>";
$str=ycs($str);
function ycs($str){
    $str = preg_replace_callback("/<style>([^<])+<\/style>/is", function($matched){
      return "abc";
}, $str);
return $str;
}
echo $str;
?>
  像我写的代码一样,php程序崩溃了!但是当我改变了   代码“/([^&lt;])+&lt; / style&gt; /是”“/ [^&lt;] +&lt; / style&gt; /是”   ,它可以再次运行,为什么?我使用xampp。

1 个答案:

答案 0 :(得分:0)

你的正则表达式的问题在于你正在捕获除<一次以外的所有内容,但是你通过使用导致丑陋的正则表达式操作的组重复此操作多次(这不应该崩溃但你会有一个丑陋的表现)。

Regular expression visualization

所以,你可以改变这个:

<style>([^<])+<\/style>

<style>([^<]+)<\/style>

上面的更改将通过重复模式然后捕获内容来改进正则表达式,我猜你想这样做。

Regular expression visualization