preg_replace抛出seg错误

时间:2010-11-11 18:08:47

标签: php segmentation-fault preg-replace

当我执行以下代码时;我每次都会遇到一个段错误!这是一个已知的错误?如何使这段代码有效?

<?php
$doc = file_get_contents("http://prairieprogressive.com/");
$replace = array(
    "/<script([\s\S])*?<\/ ?script>/",
    "/<style([\s\S])*?<\/ ?style>/",
    "/<!--([\s\S])*?-->/",
    "/\r\n/"
);
$doc = preg_replace($replace,"",$doc);
echo $doc;
?>

错误(显然)看起来像:

[root@localhost 2.0]# php test.php
Segmentation fault (core dumped)

5 个答案:

答案 0 :(得分:2)

你有不必要的捕获组,这会使PCRE的回溯变得紧张。试试这个:

$replace = array(
    "/<script.*?><\/\s?script>/s",
    "/<style.*?><\/\s?style>/s",
    "/<!--.*?-->/s",
    "/\r\n/s"
);

另一件事,\s(空白)与\S(非空白)相结合,匹配任何东西。所以只需使用.模式。

答案 1 :(得分:1)

OK!似乎()运算符存在一些问题......

当我使用

$doc = preg_replace("/<style([\s\S]*)<\/ ?style>/",'',$doc);

而不是

$doc = preg_replace("/<style([\s\S])*<\/ ?style>/",'',$doc);

它有效!!

答案 2 :(得分:1)

这似乎是一个错误。

正如你在评论中所提到的那样,正是这种风格的正则表达式引起了这种情况。作为一种变通方法,您可以使用s修饰符,以便.匹配换行符:

$doc = preg_replace("/<style.*?<\/ ?style>/s",'',$doc);

答案 3 :(得分:0)

试试这个(为unicode添加选项u并更改([\ s \ S])?to。?:

<?php
$doc = file_get_contents("http://prairieprogressive.com/");
$replace = array(
    "#<script.*?</ ?script>#u",
    '#<style.*?</ ?style>#u',
    "#<!--.*?-->#u",
    "#\r\n#u"
);
$doc = preg_replace($replace,"",$doc);
echo $doc;
?>

答案 4 :(得分:0)

[\s\S]有什么意义?它匹配任何空白字符和任何非空白字符。如果将其替换为.*,则可以正常使用。

编辑:如果您想匹配新行,请使用s修饰符。在我看来,它比一个矛盾的[\s\S]更容易理解。