当我执行以下代码时;我每次都会遇到一个段错误!这是一个已知的错误?如何使这段代码有效?
<?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)
答案 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]
更容易理解。