Regex không cho phép thẻ HTML

Các chuỗi HTML khớp mẫu phục vụ ít nhất một chức năng quan trọng trong nhà phát triển web. vệ sinh đầu vào của người dùng. Việc cho phép các chuỗi do người dùng gửi sẽ khiến ứng dụng của một người dễ bị tổn thương nghiêm trọng. Ví dụ: giả sử một số người không giỏi trên internet đã gửi nhận xét bao gồm . Biểu thức chính quy cho phép chúng tôi khớp các thẻ HTML trong một chuỗi, bởi vì các thẻ HTML tuân theo một mẫu nhất định

  • bắt đầu và kết thúc bằng dấu ngoặc []
  • chứa một tên chuỗi bao gồm một hoặc nhiều chữ cái viết thường, như p, a, div, strong, script
  • chứa 0 hoặc nhiều thuộc tính, chẳng hạn như class="btn", src="/steal_your_data.js" hoặc href="//github.com/gavin-asay"
  • được kèm theo thẻ đóng trong ngoặc với dấu gạch chéo và tên thẻ của nó, e. g. ,

    ,
hoặc
  • là thẻ tự đóng, có một hoặc nhiều ký tự khoảng trắng, sau đó là dấu gạch chéo trước dấu ngoặc đóng [>]
  • Vì vậy, để chọn ra một thẻ HTML, chúng tôi viết một biểu thức chính quy có thể tính đến các khả năng khác nhau này. Hãy xem xét regex này

    /^]+]*[?:>[.*]|\s+\/>]$/

    Nếu điều đó có vẻ vô nghĩa, thì đó là bởi vì một biểu thức chính thường thoạt nhìn. Phải mất một thời gian để chia nhỏ một biểu thức chính quy dài và hiểu ý nghĩa của mô hình của nó. Hãy phá vỡ regex này từng mảnh. Tìm trong mục lục để biết giải thích cho từng phần của biểu thức chính quy dài này

    Mục lục

    / {#gạch chéo}

    Mỗi biểu thức chính quy được đặt trong dấu gạch chéo về phía trước. Các ngôn ngữ lập trình nhận ra cú pháp này để biểu thị một biểu thức chính quy

    ^, bao gồm chữ cái, chữ số, ký hiệu và khoảng trắng khớp với lớp ký tự này

    + {#cộng2}

    Như trước đây, + khớp với một hoặc nhiều ký tự không phải->

    [. ]* {#dấu hoa thị}

    Like we mentioned above, the asterisk * matches zero or more times. Thus, our second capturing group [[^ characters. What is this very flexible pattern looking for? Anything that comes after the tag name and before the closing bracket >. That includes the tags attributes. That includes anything like classes or ids, href, src, or flags like selected or disabled.

    Hãy xem một ví dụ

    Nhóm chụp đầu tiên [[a-z]+] lấy tên thẻ [tùy chọn] và ghi nhớ nó sau này. Nhóm chụp thứ hai [[^>]+]* khớp với tất cả các thuộc tính và cờ [value="United States" id="US" selected]. Điều đó cũng được lưu trữ

    [?. . ] {#noncapture}

    Ở đây chúng ta có một nhóm khác bắt đầu bằng ?. Những nhân vật này?. biểu thị một nhóm không chụp. Một chuỗi phải khớp với mọi thứ bên trong một nhóm không chụp, nhưng nhóm này sẽ không được ghi nhớ sau này. Bạn sẽ nhận thấy rằng có các nhóm chụp trong nhóm không chụp này. Đó là những nhóm phụ mà chúng ta sẽ quan tâm hơn

    >[. *] {#khoảng thời gian}

    Ký tự đầu tiên được so khớp trong phân đoạn này là >, biểu thị phần cuối của thẻ HTML. Nhưng tại sao phần cuối của thẻ lại xuất hiện ở giữa biểu thức chính quy?

    Tiếp theo là nhóm chụp thứ ba [. *]. giai đoạn. khớp với bất kỳ ký tự nào. Vì vậy, theo thẻ HTML hoàn chỉnh, nhóm chụp thứ ba khớp với bất kỳ chuỗi nào hoặc không có chuỗi nào cả

    {#escape}

    /\ được cho là gì? . Để khớp với dấu gạch chéo lên /, chúng ta cần thoát nó. Điều này là do / là một ký tự chức năng trong biểu thức chính quy, đánh dấu phần đầu và phần cuối của mẫu

    Còn \1 thì sao? . Chụp nhóm 1 khớp với tên thẻ. Điều này không chỉ lặp lại mô hình chụp nhóm 1, nó khớp chính xác với cùng một văn bản mà nhóm 1 đã tìm thấy. Do đó, nếu tên thẻ là div, \1 cũng phải khớp với div;

    Putting this segment together, we match . You've likely caught on that this segment finds the closing tag that pairs with the opening tag we found previously. [.*] allows for any text that comes in between them. That means it can match any text or enclosed tags!

    {#đường ống}

    Ống. tách các mẫu thay thế. là một mẫu hợp lệ, nhưng những gì tiếp theo. có thể khớp thay vì

    \s+/> {#ngắn}

    Một chữ cái thoát là cách viết tắt của một lớp ký tự thường được sử dụng. Ở đây, \s khớp với bất kỳ ký tự khoảng trắng nào. dấu cách, tab hoặc ký tự xuống dòng. Các lớp hữu ích khác bao gồm \w [bất kỳ ký tự từ nào [a-zA-Z0-9_]] và \d [bất kỳ chữ số nào [0-9]]

    Làm cách nào để loại trừ các thẻ HTML trong regex?

    Dưới đây là biểu thức chính quy đơn giản để xác thực chuỗi theo mẫu thẻ HTML. Điều này sau này có thể được sử dụng để xóa tất cả các thẻ và chỉ để lại văn bản. / Thử đi.

    Tại sao bạn không nên phân tích cú pháp HTML bằng regex?

    Regex không phù hợp để phân tích cú pháp HTML vì HTML không phải là ngôn ngữ thông thường . Regex có lẽ sẽ không phải là công cụ để tiếp cận khi phân tích mã nguồn. Có các công cụ tốt hơn để tạo đầu ra được mã hóa. Tôi sẽ tránh phân tích cú pháp đường dẫn của URL và tham số truy vấn bằng biểu thức chính quy.

    Làm cách nào để xóa thẻ HTML bằng regex Python?

    Mã trên hoạt động như thế nào? .
    Ban đầu, chúng tôi nhập mô-đun regex trong python có tên 're'
    Sau đó, chúng tôi sử dụng lại. compile[] chức năng của mô-đun regex. .
    '. *' có nghĩa là không hoặc nhiều hơn 0 ký tự. .
    Sau đó, chúng tôi sử dụng lại. .
    Cuối cùng, chúng tôi gọi hàm remove_html để xóa các thẻ HTML khỏi chuỗi đầu vào

    Làm cách nào để xác thực thẻ HTML bằng cụm từ thông dụng?

    It should start with an opening tag [] without single or double quotes enclosed. It should end with a closing tag [>].

    Chủ Đề