2010-11-11 7 views
5

Lorsque j'exécute le code suivant; Je reçois une erreur de seg à chaque fois! Est-ce un bug connu? Comment puis-je faire fonctionner ce code?La fonction preg_replace génère une erreur de segmentation

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

L'erreur (évidemment) ressemble à:

[[email protected] 2.0]# php test.php 
Segmentation fault (core dumped) 
+1

Avez-vous déjà pensé à utiliser un [analyseur HTML approprié] (http://stackoverflow.com/questions/3650125/how-to-parse-html-with-php-closed)? – Gumbo

+0

Juste comme une note, je pense qu'il vous manque le '>' après le script et les balises de style. – GWW

+0

Montrez-nous l'erreur réelle. Si vous obtenez un segfault, c'est probablement un problème avec votre installation de PHP. Ou un bug. De toute façon, suivez les conseils de @ Gumbo et utilisez un analyseur HTML. – Cfreak

Répondre

2

Vous avez des groupes de capture inutiles qui sollicitent le retour arrière du PCRE. Essayez ceci:

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

Une autre chose, \s (espace) combiné avec \S (non-espace) correspond à quoi que ce soit. Il suffit donc d'utiliser le modèle ..

1

OK! Il semble qu'il y ait un certain problème avec les (...) les opérateurs

Quand j'utilise

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

au lieu de

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

cela fonctionne !!

0

Essayez cette (option supplémentaire u pour unicode et modifié ([\ s \ S]) -:.?.

<?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; 
?> 
1

Cela semble être un bug

Comme mentionné par vous dans le commentaire, il est le style regex qui est à l'origine de cette Pour contourner ce problème, vous pouvez utiliser le modificateur s de sorte que . correspond même la nouvelle ligne.

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

Quelle version de PHP Parce que quand je fais ça ça fonctionne bien. –

+0

@Viper: 'PHP 5.3.2' – codaddict

0

Quel est le point de [\s\S]? Il correspond à tout caractère d'espace et à tout caractère non-espace. Si vous le remplacez par .*, cela fonctionne très bien.

EDIT: Si vous souhaitez également faire correspondre de nouvelles lignes, utilisez le modificateur s. À mon avis, il est plus facile à comprendre qu'un [\s\S] contradictoire.

+1

' .' par défaut ne correspond pas '\ n' mais' [\ s \ S] 'le fait. – codaddict

+0

Il peut alors simplement utiliser le modificateur 's'. Ou même '[. \ N] *'. – netcoder

+0

Ouais il peut, mais en utilisant '[\ s \ S]' est également valide. – codaddict

Questions connexes