2012-06-23 31 views
6

Tôi sử dụng chức năng strip_tags() nhưng tôi cần phải xóa một số thẻ (và tất cả các nội dung của chúng).PHP: strip_tags - chỉ xóa một số thẻ nhất định (và nội dung của chúng)?

ví dụ:

<div> 
    <p class="test"> 
    Test A 
    </p> 
    <span> 
    Test B 
    </span> 
    <div> 
    Test C 
    </div> 
</div> 

Hãy nói rằng, tôi cần phải thoát khỏi P và các thẻ SPAN, và chỉ giữ:

<div> 
    <div> 
    Test C 
    </div> 
</div> 

strip_tags hy vọng như một tham số thứ hai thẻ mà bạn muốn giữ lấy.

Trong ví dụ cụ thể này, tôi có thể sử dụng striptags($html, "<div>"); nhưng html tôi đang tìm kiếm và các thẻ cần được xóa luôn khác nhau.

Tôi đã tìm kiếm số giờ cho một hàm phù hợp với nhu cầu của mình, nhưng không thể tìm thấy bất kỳ điều gì hữu ích.

Bất kỳ ý tưởng nào?

+2

Bắt đầu với [DOM] (http://php.net/dom) và [XPath] (http://uk.php.net/manual/en/class.domxpath.php) – DaveRandom

+1

Câu hỏi đã được trả lời tại đây: http://stackoverflow.com/questions/9788621/is-there-an-alternative-to-phps-strip-tags – Jocelyn

+0

Tôi đã thử câu trả lời được chấp nhận trong bài đăng này nhưng không hài lòng với kết quả – Dylan

Trả lời

11

Sử dụng cụm từ thông dụng. Một cái gì đó như thế này sẽ hoạt động:

$tags = array('p', 'span'); 
$text = preg_replace('#<(' . implode('|', $tags) . ')>.*?<\/$1>#s', '', $text); 

demo cho thấy nó thay thế các thẻ mong muốn mà không có gì.

Lưu ý rằng bạn có thể cần phải tinh chỉnh nhiều hơn, ví dụ, để bù đắp khoảng trống trong thẻ hoặc các ẩn số khác mà ví dụ của bạn không minh họa.

Đây là regex để sử dụng để chụp thẻ có hoặc không có các thuộc tính:

'#<(' . implode('|', $tags) . ')(?:[^>]+)?>.*?<\/$1>#s' 
+0

@Downvoter - Bất kỳ nhận xét nào tại sao câu trả lời chức năng của tôi bị giảm giá? – nickb

+2

Cảm ơn, điều này là hoàn hảo cho hoàn cảnh của tôi. Tôi đang cào HTML bằng cách sử dụng trình phân tích cú pháp html html đơn giản và chỉ cần thêm một số tước. – Dylan

+0

CẬP NHẬT: regex này chỉ dải các thẻ đơn không có thuộc tính ... phần sau dường như hoạt động: $ text = preg_replace ('# <('. Implode ('|', $ tags). '). *>. *? #s ',' ', $ text); – Dylan

1

Bạn nói rằng bạn đang sử dụng đơn giản DOM HTML (! Tốt Đó là cách đúng đắn để phân tích cú pháp HTML). Khi tôi cần phải loại bỏ một thẻ và nội dung của nó, tôi làm:

$rows = $html->find("span"); 

foreach ($rows as $row) 
{ 
    $row->outertext = ""; 
} 

$html->load($html->save()); 

Dòng cuối cùng là cần thiết vì DOM bị nhầm lẫn sau khi sửa đổi được thực hiện cho toàn bộ DOM phải được sụp đổ và sau đó được phân tích một lần nữa để các thay đổi được thực hiện vĩnh viễn (IMO, một lỗi trong Simple HTML DOM).

Phương pháp tiếp cận HTML HTML đơn giản an toàn hơn và ổn định hơn so với cụm từ thông dụng.

Các vấn đề liên quan