preg_replace выдает ошибку seg - PullRequest
5 голосов
/ 11 ноября 2010

Когда я выполняю следующий код; Я каждый раз получаю ошибку сегмента! Это известная ошибка? Как я могу заставить этот код работать?

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

2 голосов
/ 11 ноября 2010

У вас есть ненужные группы захвата, которые затягивают откат PCRE.Попробуйте это:

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

Другое дело, \s (пробел) в сочетании с \S (не пробел) соответствует чему угодно.Так что просто используйте шаблон ..

1 голос
/ 11 ноября 2010

Кажется, это ошибка.

Как вы уже упоминали в комментарии, это является регулярным выражением стиля.В качестве обходного пути вы можете использовать модификатор s, чтобы . соответствовал даже новой строке:

$doc = preg_replace("/<style.*?<\/ ?style>/s",'',$doc);
1 голос
/ 11 ноября 2010

OK! Кажется, что есть проблема с операторами () ...

Когда я использую

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

вместо

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

это работает !!

0 голосов
/ 11 ноября 2010

Какой смысл [\s\S]? Он соответствует любому пробелу и любому непробельному символу. Если вы замените его на .*, он будет работать нормально.

РЕДАКТИРОВАТЬ: Если вы также хотите сопоставить новые строки, используйте модификатор s. На мой взгляд, это легче понять, чем противоречиво [\s\S].

0 голосов
/ 11 ноября 2010

Попробуйте это (добавлена ​​опция 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;
?>
...