Tôi đã viết một hệ thống quản lý nội dung sử dụng biểu thức chính quy phía máy chủ để thoát khỏi ký hiệu và trả lời trang ngay trước khi nó được gửi tới trình duyệt của khách hàng. Cụm từ thông dụng là chú ý các ký hiệu và đã được thoát hoặc là một phần của thực thể HTML. Ví dụ, sau đây:Cụm từ thông dụng để loại bỏ HTML và khi tuân thủ CDATA
a & b, c & d, © 2009
được thay đổi như sau:
a & b, c & d, © 2009
(Chỉ &
đầu tiên được sửa đổi.) Đây là biểu hiện thường xuyên, được thực hiện và sửa đổi từ một helper Rails:
html.gsub(/&(?!([a-zA-Z][a-zA-Z0-9]*|(#\d+));)/) { |special| ERB::Util::HTML_ESCAPE[special] }
Mặc dù công trình này rất tuyệt nhưng nó vẫn gặp sự cố. Cụm từ thông dụng không nhận biết được bất kỳ số <![CDATA[
hoặc ]]>
nào có thể bao quanh các ký hiệu không thoát. Điều này là cần thiết cho JavaScript nhúng để không bị ảnh hưởng. Ví dụ, điều này:
<script type="text/javascript">
// <![CDATA[
if (a && b) doSomething();
// ]]>
</script>
là không may rendered như thế này:
<script type="text/javascript">
// <![CDATA[
if (a && b) doSomething();
// ]]>
</script>
trong đó tất nhiên các công cụ JavaScript không hiểu.
Câu hỏi của tôi là: Có cách nào để sửa đổi cụm từ thông dụng để thực hiện chính xác như bây giờ với ngoại lệ là nó để lại văn bản bên trong phần CDATA bị ảnh hưởng không?
Vì cụm từ thông dụng không đơn giản để bắt đầu, câu hỏi này có thể dễ trả lời hơn: Có thể viết cụm từ thông dụng sẽ thay đổi tất cả các chữ cái trong một khoảng thời gian ngoại trừ các chữ cái giữa '<
' và '>
'? Ví dụ: một cái sẽ thay đổi "some <words> are < safe! >"
thành ".... <words> ... < safe! >"
?
Tôi sẽ ngạc nhiên nếu điều này có thể được giải quyết bằng cách sử dụng chỉ regexes, vì vậy tôi là tất cả các háo hức hơn để xem ai đó trả lời câu hỏi này :-) –
Làm thế nào người dùng sẽ hiển thị chuỗi thực tế '&' nếu họ muốn ? (ví dụ: trong một mẫu HTML) – orip