2008-09-04 17 views
26

Tôi đang cố gắng viết một cụm từ thông dụng để loại bỏ tất cả HTML ngoại trừ các liên kết (các thẻ <a href</a> tương ứng. Nó không phải an toàn 100% (Tôi không lo lắng về việc tiêm) các cuộc tấn công hoặc bất cứ điều gì như tôi phân tích nội dung đã được phê duyệt và công bố vào một bộ phim SWF).Chặn tất cả các thẻ HTML ngoại trừ các liên kết

"thẻ dải" ban đầu biểu hiện thường xuyên tôi đang sử dụng là <(.|\n)+?>, và tôi đã cố gắng để sửa đổi nó để <([^a]|\n)+?>, nhưng tất nhiên, điều đó sẽ cho phép bất kỳ thẻ nào có một số một số trong đó thay vì thẻ có nó ở đầu, với một khoảng trắng.

Không phải là nó thực sự quan trọng, nhưng trong trường hợp bất cứ ai quan tâm để biết tôi viết này trong ActionScript 3.0 cho một bộ phim Flash.

Trả lời

26
<(?!\/?a(?=>|\s.*>))\/?.*?> 

Hãy thử điều này. Đã có một cái gì đó tương tự cho các thẻ p. Làm việc cho họ vì vậy không thấy lý do tại sao không. Sử dụng lookahead tiêu cực để kiểm tra xem nó không khớp với một (bắt đầu với một tùy chọn/ký tự) trong đó (sử dụng lookahead dương) a (với optional/prefix) được theo sau bởi a> hoặc một dấu cách, rồi sau đó>. Điều này sau đó phù hợp cho đến khi ký tự tiếp theo>. Đặt điều này trong một subst với

s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g; 

này nên để lại chỉ khai mạc và bế một thẻ

+0

này không làm việc cho tôi với 'sed' ... – Geremia

-1

Làm thế nào về

<[^a](.|\n)+?> 

?

+0

Điều này sẽ giúp loại bỏ nhưng

1

Tôi tiếp tục xảy ra về nó, nhưng không có cách nào tôi có thể khuyên regexr quá thường xuyên. Thật tuyệt vời khi thử nghiệm loại điều này.

1

Nói chung có vấn đề với cách tiếp cận này. Regexes là tốt nhất cho các trận đấu văn bản 'phẳng' - dữ liệu lồng nhau đẩy động cơ regex vào các khu vực mà chúng không được thiết kế. Phân tích cú pháp HTML chung cần một trình phân tích cú pháp không phải là công cụ regex (Google cho sự khác biệt giữa các ngôn ngữ thông thường và ngữ cảnh nếu bạn muốn có đầy đủ chi tiết kỹ thuật). Bạn có thể dễ dàng loại bỏ tất cả các thẻ bằng cách thay thế/</và/>/bằng chuỗi rỗng hoặc các thực thể tương đương nhưng lọc có chọn lọc HTML bằng các regex sẽ dễ bị xâm phạm.

0

Ở đây bạn đi:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>} 
-2

strip_tags() thực hiện điều này.

Ở đây, tôi bao gồm tất cả <a><p><font><b><i><sup> thẻ và xuất một phiên bản sắp xếp gọn gàng:

cat input.htm | tr -d '\n' | php -r '$input=fgets(STDIN); echo strip_tags($input,"<a><p><font><b><i><sup>");' | tidy -i -wrap 0 -o output.htm