2010-11-11 29 views
5

Khi tôi thực thi mã sau; Tôi nhận được một lỗi seg mỗi lần! Đây có phải là một lỗi được biết đến? Làm thế nào tôi có thể làm cho mã này hoạt động?preg_replace ném lỗi 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; 
?> 

Các lỗi (rõ ràng) trông giống như:

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

Bạn đã bao giờ nghĩ đến việc sử dụng [trình phân tích HTML thích hợp] (http://stackoverflow.com/questions/3650125/how-to-parse-html-with-php-closed) chưa? – Gumbo

+0

Cũng giống như một lưu ý, tôi nghĩ rằng bạn đang thiếu '>' sau thẻ script và kiểu. – GWW

+0

Hiển thị cho chúng tôi lỗi thực tế. Nếu bạn đang nhận được một segfault nó có thể là một vấn đề với cài đặt PHP của bạn. Hoặc một lỗi. Dù bằng cách nào, hãy làm theo lời khuyên của @ Gumbo và sử dụng trình phân tích cú pháp HTML. – Cfreak

Trả lời

2

Bạn có các nhóm chụp không cần thiết làm căng thẳng luồng dữ liệu của PCRE. Hãy thử điều này:

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

Một điều, \s (khoảng trắng) kết hợp với \S (không khoảng trắng) phù hợp với bất cứ điều gì. Vì vậy, chỉ cần sử dụng mẫu ..

1

OK! Nó có vẻ như có một số vấn đề với) các nhà khai thác (...

Khi tôi sử dụng

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

thay vì

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

nó hoạt động !!

0

Hãy thử điều này (thêm tùy chọn u cho unicode và thay đổi ([\ 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

này có vẻ là một lỗi

Như đã đề cập bởi bạn trong nhận xét, đó là kiểu regex gây ra lỗi này, do đó bạn có thể sử dụng công cụ sửa đổi s để . đối sánh ngay cả dòng mới:

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

Phiên bản nào của PHP Bởi vì khi tôi làm điều đó nó hoạt động tốt. –

+0

@Viper: 'PHP 5.3.2' – codaddict

0

Điểm của [\s\S] là gì? Nó khớp với bất kỳ ký tự trắng nào và bất kỳ ký tự không khoảng trống nào. Nếu bạn thay thế nó bằng .*, nó hoạt động tốt.

CHỈNH SỬA: Nếu bạn cũng muốn khớp các dòng mới, hãy sử dụng công cụ sửa đổi s. Theo tôi, nó dễ hiểu hơn là mâu thuẫn [\s\S].

+1

' .' theo mặc định không khớp với '\ n' nhưng' [\ s \ S] '. – codaddict

+0

Anh ta chỉ có thể sử dụng công cụ sửa đổi 's'. Hoặc thậm chí '[. \ N] *'. – netcoder

+0

Có thể, nhưng sử dụng '[\ s \ S]' cũng hợp lệ. – codaddict