2009-07-11 37 views
6

Tôi đã một div id muốn loại bỏ từ một đầu ra trông giống nhưLàm thế nào tôi có thể loại bỏ một yếu tố html và nội dung của nó sử dụng RegEx

<div id="ithis" class="cthis">Content here which includes other elements etc..) </div> 

Làm thế nào tôi có thể loại bỏ div này và tất cả mọi thứ bên trong nó sử dụng PHP và regex ?

Cảm ơn bạn.

+0

Bạn có thể xây dựng thêm không? Đây có phải là dạng chuỗi không? –

+1

bạn có biết tên id và/hoặc tên lớp không? Hoặc có bất kỳ định danh riêng biệt nào của id và/hoặc lớp để bạn không xóa tất cả các div rơi vào mô tả đó không? Hoặc bạn có muốn xóa tất cả các div và nội dung của chúng không? –

Trả lời

13

Câu trả lời đơn giản là bạn không. Bạn sử dụng một trong nhiều trình phân tích cú pháp HTML của PHP để thay thế. Regexes là cách xử lý HTML dễ bị lỗi và dễ bị lỗi.

đó được cho biết bạn có thể làm điều này:

$html = preg_replace('!<div\s+id="ithis"\s+class="cthis">.*?</div>!is', '', $html); 

Nhưng nhiều thứ có thể sai với điều này. Ví dụ, nếu có chứa một div:

<div id="ithis" class="cthis">Content here which <div>includes</div> other elements etc..) </div> 

bạn sẽ kết thúc với:

other elements etc..) </div> 

như regex sẽ dừng lại ở </div> đầu tiên. Và không có gì bạn thực sự có thể làm để giải quyết vấn đề này (với các biểu thức chính quy) một cách nhất quán.

Done với một phân tích cú pháp nó trông như thế này:

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$element = $doc->getElementById('ithis'); 
$element->parentNode->removeChild($element); 
$html = $doc->saveHTML(); 
+0

+1. Nó là giá trị bình luận rằng (A) Nếu phần tử không tồn tại, sau đó '$ element' là' NULL' và lệnh '-> removeChild()' sẽ thất bại với một lỗi nghiêm trọng, và (B) bạn có thể/có thể muốn sử dụng '@' để làm cho '-> loadHTML()' tắt tiếng bất kỳ thông báo nào về HTML không đúng định dạng: '@ $ doc-> loadHTML ($ html);' –

1

Tôi không biết về PHP, nhưng bạn có thể thay thế /<id.*?<\/id[^>]*>/ với không có gì.

0

PHP là phía máy chủ và đầu ra đến từ máy chủ. Bạn không thể không xuất nó? Hay bạn đang cố che giấu nó? Nếu vậy, trong biểu định kiểu, chỉ cần nói #ithis {display:none}.

Nếu chuỗi là một trở về từ một số hàm trong PHP mà bạn chưa viết VÀ bạn không muốn muck với mã đó, bạn phải viết một regex rất khó để tính toán cho div lồng nhau, cú pháp khác nhau trong đầu ra, vv Tôi muốn khuyên bạn nên sử dụng một số phân tích cú pháp (có lẽ điều này Zend Framework component) để giúp bạn ra ngoài. Tôi đã sử dụng nó một vài lần cho một cái gì đó tương tự. Mặc dù nếu bạn không quen thuộc với ZF ở tất cả, bạn có thể muốn thử cái gì khác.

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