2010-11-11 14 views
5

Aşağıdaki kodu çalıştırdığımda; Her seferinde seg hatası alıyorum! Bu bilinen bir hata mı? Bu kodu nasıl çalıştırabilirim?preg_replace bölüm hatası atar

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

Hiç [uygun HTML çözümleyici] kullanmayı düşündünüz mü (http://stackoverflow.com/questions/3650125/how-to-parse-html-with-php-closed)? – Gumbo

+0

Sadece bir not olarak, senaryo ve stil etiketlerinden sonra '>' eksik olduğunu düşünüyorum. – GWW

+0

Bize gerçek hatayı göster. Bir segfault alıyorsanız, PHP kurulumunuzla ilgili bir sorun olabilir. Ya da bir böcek. Her iki şekilde de, Gumbo'nun tavsiyelerini takip edin ve bir HTML ayrıştırıcı kullanın. – Cfreak

cevap

2

PCRE'nin geri izlemesini zorlayan gereksiz yakalama gruplarınız var. Bu deneyin:

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

\S (non-boşluk) ile kombine Başka bir şey, \s (boşluk) bir şey eşleşir. Yani sadece . modelini kullanın.

1

Tamam:

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

hatası (besbelli) gibi görünüyor!() Operatörleri ile bazı sorun var gibi yerine

$doc = preg_replace("/<style([\s\S])*<\/ ?style>/",'',$doc); 
çalıştığını

ait

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

kullandığınızda O

... görünüyor !!

0

unicode için bu (katma seçeneği u deneyin ve) [\ s \ S] (değiştirildi:?.?.

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

Bu bir hata gibi görünüyor

tarafından belirtildiği gibi

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

PHP'nin hangi sürümü Çünkü bunu yaptığımda iyi çalışıyor. –

+0

@Viper: 'PHP 5.3.2' – codaddict

0
. yorumda siz, bu . bile yeni satırı eşleşmesi için bir çözüm olarak, s değiştirici kullanabileceğiniz bu neden olan stil regex olduğunu

[\s\S]'un anlamı nedir? Herhangi bir boşluk karakteri ve herhangi bir boşluk olmayan karakterle eşleşir. .* ile değiştirirseniz, iyi çalışır.

DÜZENLEME: Yeni satırları da eşleştirmek istiyorsanız, s değiştiricisini kullanın. Benim düşünceme göre, çelişkili bir [\s\S]'dan daha anlaşılması daha kolaydır.

+1

'. 'Varsayılan olarak \ n' ile eşleşmiyor, ancak [\ s \ S]' yapar. – codaddict

+0

Sadece 's değiştiricisini kullanabilir. Hatta "[. \ N] *". – netcoder

+0

Evet yapabilir, ancak '[\ s \ S]' özelliğini kullanarak da geçerlidir. – codaddict