繁体   English   中英

preg_replace抛出seg错误

[英]preg_replace throws seg fault

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

<?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)

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

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

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

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

我用的时候

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

代替

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

有用!!

这似乎是一个错误。

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

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

试试这个(为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;
?>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM