2010-11-11 14 views
5

Quando eseguo il seguente codice; Ogni volta che ottengo un difetto! È un bug noto? Come posso far funzionare questo codice?preg_replace genera un errore seg

<?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'errore (ovviamente) si presenta come:

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

Hai mai pensato di utilizzare [un parser HTML corretto] (http://stackoverflow.com/questions/3650125/how-to-parse-html-with-php-closed)? – Gumbo

+0

Come nota, penso che manchi il '>' dopo i tag di script e di stile. – GWW

+0

Mostraci l'errore attuale. Se stai ricevendo un segfault, è probabile che si sia verificato un problema con l'installazione di PHP. O un bug. In ogni caso, segui il consiglio di @ Gumbo e usa un parser HTML. – Cfreak

risposta

2

Hai gruppi di acquisizione non necessari che mettono a dura prova il backtrack di PCRE. Prova questo:

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

Un'altra cosa, \s (spazi bianchi) in combinazione con \S (non spazi bianchi) corrisponde a qualsiasi cosa. Quindi basta usare il modello ..

1

OK! Sembra che ci sia qualche problema con gli operatori() ...

Quando uso

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

invece di

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

funziona !!

0

Prova questo (aggiunta opzione u per Unicode e modificati ([\ 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

Questo sembra essere un bug

Come menzionato da voi nel commento, è l'espressione regolare stile che sta causando questo come una soluzione alternativa è possibile utilizzare il modificatore s in modo che . corrisponde anche il ritorno a capo:.

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

Quale versione di PHP Perché quando lo faccio funziona perfettamente. –

+0

@Viper: 'PHP 5.3.2' – codaddict

0

Qual è il punto di [\s\S]? Corrisponde a qualsiasi carattere di spaziatura e qualsiasi carattere non di spazio bianco. Se lo sostituisci con .*, funziona perfettamente.

MODIFICA: se si desidera abbinare anche le nuove linee, utilizzare il modificatore s. Secondo me, è più facile capire che un contraddittorio [\s\S].

+1

' .' di default non corrisponde a '\ n', ma' [\ s \ S] 'fa. – codaddict

+0

Quindi può semplicemente usare il modificatore 's'. O anche '[. \ N] *'. – netcoder

+0

Sì, è possibile, ma anche usare '[\ s \ S]' è valido. – codaddict