Валидация HTML тегов с помощью регулярного выражения в Java

Статья рассматривает пример валидации HTML тегов с помощью регулярных выражений в среде Java. В конце мы протестируем наш валидатор с помощью библиотеки TestNG.

Регулярное выражение для валидации HTML тегов

<("[^"]*"|'[^']*'|[^'">])*>

Пояснения по регулярному выражению:

<          # Тег должен начинаться с "<"
  (        # Начало группы 1
    "[^"]*"          # Разрешены строки, заключенные в одинарные кавычик - "string"
      |          # Или
    '[^']*'          # Разрешены строки, заключенные в одинарные кавычки - 'string'
      |          #    Или
    [^'">]           # Не может содержать одиночные двойные, одинарные кавычки и символы ">"
  )        # Конец группы 1
 *         # Все это можте повторяться 1 или более раз
>          # Тег должен заканчиваться символом ">"

Валидация HTML тегов

package ru.j4web.examples.java.regex.htmltagsvalidatorexample;

import java.util.regex.Pattern;

public class HTMLTagsValidator {
    
    private static final String HTML_TAGS_PATTERN 
            = "<("[^"]*"|'[^']*'|[^'">])*>";
    
    private final Pattern pattern;
    
    public HTMLTagsValidator() {
        pattern = Pattern.compile(HTML_TAGS_PATTERN);
    }
    
    public boolean validate(final String htmlTag) {
        return pattern.matcher(htmlTag).matches();
    }
}

Корректные HTML теги

Определенному выше регулярному выражению соответствуют следующие HTML теги:

  • <b>, <input value='>'>;
  • <input value='<'>, <b/>;
  • <a href='http://www.google.com'>;
  • <br>, <br/>;
  • <input value="" id='test'>, <input value='' id='test'>.

Некорректные HTML теги

Следующие строки не являются корректными HTML тегами:

  • <input value=" id='test'> — использование одиночных двойных кавычек недопустимо;
  • <input value=' id='test'> — использование одиночных одинарных кавычек недопустимо;
  • <input value=> > — использование символа < внутри тега недопустимо.

Тестирование регулярного выражения

package ru.j4web.examples.java.regex.htmltagsvalidatorexample;

import junit.framework.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class HTMLTagsValidatorTest {
    
    private static HTMLTagsValidator validator;
    
    @BeforeClass
    public static void setUpClass() throws Exception {
        validator = new HTMLTagsValidator();
    }
    
    @DataProvider
    public Object[][] validHTMLTags() {
        return new Object[][]{
            new Object[]{"<b>"}, new Object[]{"<input value='>'>"},
            new Object[]{"<input value='<'>"}, new Object[]{"<b/>"},
            new Object[]{"<a href='http://www.google.com'>"},
            new Object[]{"<br>"}, new Object[]{"<br/>"},
            new Object[]{"<input value="" id='test'>"},
            new Object[]{"<input value='' id='test'>"}
        };
    }
    
    @DataProvider
    public Object[][] invalidHTMLTagsValidator() {
        return new Object[][] {
            new Object[]{"<input value=" id='test'>"},
            new Object[]{"<input value=' id='test'>"},
            new Object[]{"<input value=> >"}
        };
    }
    
    @Test(dataProvider="validHTMLTags")
    public void validHTMLTagsTest(final String htmlTag) {
        boolean valid = validator.validate(htmlTag);
        System.out.println("Tag "" + htmlTag + "" is valid: " + valid);
        Assert.assertTrue(valid);
    }

    @Test(dataProvider="invalidHTMLTags", dependsOnMethods="validHTMLTagsTest")
    public void invalidHTMLTagsTest(final String htmlTag) {
        boolean valid = validator.validate(htmlTag);
        System.out.println("Tag "" + htmlTag + "" is valid: " + valid);
        Assert.assertFalse(valid);
    }
}
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running ru.j4web.examples.java.regex.htmltagsvalidatorexample.HTMLTagsValidatorTest
Tag "<b>" is valid: true
Tag "<input value='>'>" is valid: true
Tag "<input value='<'>" is valid: true
Tag "<b/>" is valid: true
Tag "<a href='http://www.google.com'>" is valid: true
Tag "<br>" is valid: true
Tag "<br/>" is valid: true
Tag "<input value="" id='test'>" is valid: true
Tag "<input value='' id='test'>" is valid: true
Tests run: 10, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.465 sec

Results :

Tests run: 10, Failures: 0, Errors: 0, Skipped: 1

------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------

Оставить комментарий

Ваш email нигде не будет показанОбязательные для заполнения поля помечены *

*