[英]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.