2009-07-23 28 views
6

Tôi chỉ tự hỏi nếu có ai biết một chức năng để loại bỏ tất cả các lớp học từ một chuỗi trong php .. Về cơ bản tôi chỉ muốndải tất cả các lớp từ p thẻ

<p> 

thẻ chứ không phải

<p class="..."> 

Nếu có ý nghĩa :)

Trả lời

8

Một regex khá ngây thơ có thể sẽ làm việc cho bạn

$html=preg_replace('/class=".*?"/', '', $html); 

Tôi nói ngây thơ vì nó sẽ thất bại nếu văn bản nội dung của bạn đã xảy ra để chứa class = "something" vì lý do nào đó !. Nó có thể được thực hiện một chút mạnh mẽ hơn bằng cách tìm kiếm class = "" bên trong các thẻ có nhãn lợ góc cạnh nếu cần thiết.

+0

Cảm ơn rất nhiều, hoạt động như một nét duyên dáng :) – SoulieBaby

+0

Mã có hoạt động với trường hợp trên/dưới, đơn/đôi/không có dấu ngoặc kép, khoảng cách giữa không gian, dấu cách trước và sau lớp không? –

+0

Không - chỉ các trường hợp được OP chỉ ra. Bất cứ điều gì khác còn lại là một bài tập cho người đọc :) –

1

Tôi sẽ làm một việc như thế này trên jQuery. Đặt điều này vào tiêu đề trang của bạn:

$(document).ready(function(){ 
$(p).each(function(){ 
    $(this).removeAttr("class"); 
    //or $(this).removeclass("className"); 
}) 

});

+0

Không phải PHP, nhưng một giải pháp tốt hơn – Draemon

+2

Không chắc chắn làm thế nào mà có thể tốt hơn mà không biết tại sao OP lại muốn làm điều này. –

+0

Không tốt hơn, chỉ cần một cách khác để làm điều đó :) – Teknotica

2

Có lẽ đó là một chút quá mức cần thiết cho nhu cầu của bạn, nhưng, để phân tích/xác nhận/dữ liệu HTML sạch, công cụ tốt nhất mà tôi biết là HTML Purifier

Nó cho phép bạn xác định các thẻ, và đó thuộc tính, là OK; và/hoặc cái nào không; và nó cung cấp HTML hợp lệ/sạch (X) làm đầu ra.

(Sử dụng regexes để "phân tích" HTML có vẻ OK ngay từ đầu ... Và sau đó, khi bạn muốn thêm thứ cụ thể, nó thường trở thành địa ngục để hiểu/duy trì)

+0

Đúng nếu tôi sai, nhưng không phân tích từ vựng đúng XML phân tích cú pháp sử dụng chọn XML ngoài với anyways regex? Tôi nghĩ rằng vấn đề thực sự là khi mọi người cố gắng tự mình thực hiện phân tích cú pháp regex, họ cố gắng nhảy đến giữa hoặc cuối của chuỗi thay vì bắt đầu ở đầu chuỗi giống như trình phân tích cú pháp thực. – joebert

+1

Tôi không nghĩ rằng họ làm - không chắc chắn về nó, nhưng ... có vẻ kỳ quặc. Dù sao, ngay cả khi họ làm, họ có lẽ là thử nghiệm nhiều hơn (vì chúng được sử dụng rộng rãi) hơn so với regex bạn sẽ viết cho chính mình cho dự án của riêng bạn. –

2

Bạn nạp HTML vào một lớp DOMDocument, tải nó vào simpleXML. Sau đó, bạn thực hiện truy vấn XPath cho tất cả các phần tử p và sau đó lặp qua chúng. Trên mỗi vòng lặp, bạn đổi tên thuộc tính lớp thành một cái gì đó như "killmeplease".

Khi thực hiện xong, hãy tái xuất lại XML đơn giản dưới dạng XML (mà, bằng cách này, có thể thay đổi HTML, nhưng thường chỉ cho tốt hơn) và bạn sẽ có chuỗi HTML trong đó mỗi p có một lớp "killmeplease" . Sử dụng str_replace để thực sự loại bỏ chúng.

Ví dụ:

$html_file = "somehtmlfile.html"; 

$dom = new DOMDocument(); 
$dom->loadHTMLFile($html_file); 

$xml = simplexml_import_dom($dom); 

$paragraphs = $xml->xpath("//p"); 

foreach($paragraphs as $paragraph) { 
    $paragraph['class'] = "killmeplease"; 
} 

$new_html = $xml->asXML(); 

$better_html = str_replace('class="killmeplease"', "", $new_html); 

Hoặc, nếu bạn muốn làm cho mã đơn giản hơn nhưng mớ với preg_replace, bạn có thể đi với:

$html_file = "somehtmlfile.html"; 
$html_string = file_get_contents($html_file); 

$bad_p_class = "/(<p).*(class=.*)(\s.*>)/"; 

$better_html = preg_replace($bad_p_class, '$1 $3', $html_string); 

một phần khó khăn với biểu thức thông thường là họ có xu hướng để tham lam và cố gắng tắt nó có thể gây ra vấn đề nếu thẻ phần tử p của bạn có ngắt dòng trong đó. Nhưng hãy cho một trong số đó.

1

Máy lọc HTML

HTML có thể rất khó khăn để regex vì hàng trăm cách mã khác nhau có thể được viết hoặc định dạng.

HTML purifier là thư viện nguồn mở dành cho người lớn để dọn dẹp HTML. Tôi sẽ tư vấn cho việc sử dụng nó trong trường hợp này.

Trong tài liệu cấu hình của trình lọc HTML, bạn có thể chỉ định các lớp và thuộc tính cần được cho phép và trình lọc sẽ làm gì nếu tìm thấy chúng.

http://htmlpurifier.org/docs/

2
$html = "<p id='fine' class='r3e1 b4d 1' style='widows: inherit;'>";  
preg_replace('/\sclass=[\'|"][^\'"]+[\'|"]/', '', $html); 

Nếu bạn đang được đưa vào thử nghiệm chống HTML Microsoft Office xuất bạn sẽ cần nhiều hơn đẳng cấp loại bỏ nhưng HTML Tidyconfig flag chỉ dành cho Microsoft Office!

Nếu không, điều này sẽ an toàn hơn một số câu trả lời khác vì chúng hơi tham lam và bạn không biết loại đóng gói nào sẽ được sử dụng (' hoặc ").

Lưu ý: Các mô hình thực sự là /\sclass=['|"][^'"]+['|"]/ nhưng, như có cả ngoặc kép (") dấu nháy ('), tôi phải thoát khỏi tất cả các lần xuất hiện của một (\') để đóng gói các mô hình.

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