Validate html tag bằng regex

Chào mọi người,
Hiện em đang tìm cách viết một regex để validate một phân tử html. Với các yêu cầu là:

  1. Tên bắt đầu và kết thúc của một tag phải giống nhau. Vd: <h1>hello world</h1>
  2. Tên tag chỉ chứa các kí tự [A-Z][a-z][0-9]_
  3. Các tag có thể lồng nhau nhưng nếu giống như này: <h1><a>contents</a>invalid</h1> thì sẽ không hợp lệ.
  4. Nội dung trong tag không được chứa chuỗi thoã mãn regex /<\/?\w+>/

Một số ví dụ:

<h1>Nayeem loves counseling</h1> (valid)
<h1><h1>Sanjay has no watch</h1></h1> (valid)
<h1><h1>Sanjay has no watch</h1>adwdwdw</h1> (invalid)
<par  erf>So wait for a while</par  erf> (invalid)
<Amee>safat codes like a ninja</amee> (invalid)
<SApremium>Imtiaz has a secret <> crush</SApremium> (valid)
<SApremium>Imtiaz has a secret </te> crush</SApremium> (invalid)
<SApremium>Imtiaz has a secret <h2> crush</SApremium> (invalid)

Em đã cố thực hiện regex trên nhưng hiện tại vẩn chưa nghĩ ra được. Hiện tại, em chỉ mới viết được dạng chung cho regex trên: <(\w+)>([^<>]+)<\/\1>. Nó chỉ mới thoã mãn được 2 yêu cầu đầu đề ra! :neutral_face:

Với yêu cầu thứ tư thì em có viết ra được một regex để validate chuỗi không chứa /<\/?\w+>/ đấy là: ^(?!.*<\/?\w+>).*$. Nhưng em chưa tìm ra cách để kết hợp với chúng lại??? :slightly_frowning_face:
Xin mọi người góp ý và giúp đỡ ạ!!! :sweat_smile:

1 Like

Cho lồng element thì regex không match nổi đâu, nhất là Java nữa.

4 Likes

Trước mình crawl cũng định dùng regex để lấy thông tin, sau khi mò một hồi thì biết là regex không dùng để parse html
Nhưng nếu đây là bài tập thì chắc chỉ cho mấy cái ví dụ có dạng html thôi, chứ k phải là file html, và đã là bài tập thì phải có bài chữa nên bài bạn đưa mình nghĩ là có hướng giải.
Hướng giải sao thì mình k biết :joy:

4 Likes

Regex không dùng để parse HTML, nhưng điều đó không có nghĩa rằng Regex không thể được dùng để validate HTML. Giả sử có một chuỗi HTML không đúng cú pháp, chạy trên trình duyệt. Khi trình duyệt xử lí đoạn code HTML đó, nó đã sửa lại đoạn code trên theo cách hiểu của nó, viẽ này có thể bị lợi dụng đê tạo ra một dạng XSS đặc biệt gọi là Mutation XSS, ngay cả Google cũng từng bị dính phải.


Trở lại vấn đề chính, yêu cầu 1 và 2 dùng Regex là đúng, còn yêu cầu 3 và 4 thì bắt buộc phải dùng thư viện xử lí HTML/XML, cái yêu cầu 1 được tạo ra để đảm bảo cho code HTML đúng cú pháp để parse code.

4 Likes

À cái này là vấn đề mở rộng mà mình tự đặt ra sau khi làm một bài trên hackerrank nên không có lời giải đâu bạn :sweat_smile: Bài trên hackerrank chỉ có yêu cầu 1 và 2. Sau khi nghĩ thêm thì mi đưa thêm yêu cầu 3,4 để nó giống với tag html hơn. Nhưng cuối cùng suy nghĩ mãi không ra cách nên nhờ mọi người góp ý! Nếu có thể thì nó cũng là 1 cách hay để validate cho html :sweat_smile:

2 Likes

Không liên quan nhưng cái này valid mà :joy:

Đấy, cả web này cũng hiện valid nè.

3 Likes

Đọc lại yêu cầu thứ 3 á bác! Ở đây bài toán yêu cầu vậy. Chứ chưa nói đến thực tế mà bác?

Để đây và không nói gì thêm :roll_eyes:

4 Likes

Bác lại thích bắt bẻ, ở đây mình chỉ nói về bài toán mình đặt ra validate theo yêu cầu chứ chưa nói gì đến thực tế!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?