2017-02-03 5 views
-4

Разрешенные теги хранятся в списке. Мне нужен простой метод проверки, который возвращает false, если тестовая строка содержит any «недопустимые теги».Как проверить, что строка содержит (если) только допустимые теги html?

мне нужно smthg лучше

static final Pattern TAG_PATTERN = Pattern.compile("(?<=</?)([^ >/]+)") 
static final ArrayList<String> allowedTags = ["p", "div", "b", "strong" ,"ul" ,"li", "span", "style", "a", "table", "tr", "th","td"] 

static Boolean parseTag(String str){ 
    Matcher m = TAG_PATTERN.matcher(str); 
    while(m.find()) { 
     String tag = m.group(1); 
     if (!allowedTags.contains(tag)){ 
      return false 
     } 
    } 
    return true 
} 
+1

, пожалуйста, поделитесь своим кодом, относящимся к этому случаю. Не спрашивайте, прежде чем попробовать. – bxc00zzy

+1

'String.contains (tag)'? У вас есть список, чтобы перебрать список ... Пожалуйста, см. [Ask] – AxelH

+0

Мне нужно найти любые теги (если есть) НЕ из списка. Итерации, что? – Sergey

ответ

0

Предполагая, что вы имеете дело с, возможно, не хорошо сформированной HTML, то tagsoup parser может быть вариант, так как он может разобрать malformatted (то есть «реальный» в том смысле, что много HTML-источника в Интернете плохо сформировано) html/xml source.

Следующий код использует TagSoup и заводную XmlSlurper для разбора ввода и проверок со списком допустимых имен тегов:

@Grab('org.ccil.cowan.tagsoup:tagsoup:1.2.1') 
import org.ccil.cowan.tagsoup.Parser 

def html = ''' 
<html> 
    <body> 
    <span>some content</span> 
    </body> 
    <not-allowed>some content</not-allowed> 
</html> 
''' 

def document = new XmlSlurper(new Parser()).parseText(html) 
def validTags = ['html', 'body', 'span'] 

def isValid = document.'**'.every { tag -> 
    println "${tag.name()} is ${tag.name()?.toLowerCase() in validTags ? '' : 'not '} allowed" 
    tag.name()?.toLowerCase() in validTags 
} 

println "\nVALID: $isValid" 

производит:

html is allowed 
body is allowed 
span is allowed 
not-allowed is not allowed 

VALID: false 

код использует XmlSlurper из заводных библиотек , Оператор ** выполняет depth first поиск по всем тегам в структуре xml, а вызов every возвращает false, если какой-либо из выражений tag.name()?.toLowerCase() in validTags возвращает false.

редактировать: если у вас есть хорошо сформированные HTML, вы можете использовать выше и просто заменить разбора строки с:

def document = new XmlSlurper().parseText(html) 

и выйти из директивы @Grab и import в верхней части сценария ,

Смежные вопросы