Как выделить искомые слова с помощью регулярного выражения

#regex #grails #groovy

#регулярное выражение #grails #groovy

Вопрос:

Привет, я работаю над отличным приложением, которое требует, чтобы я выделял (добавлял промежутки) к искомому слову.Например, учитывая текст ниже :

 youtube

[href="youtube.com] i am here , in Youtube[/a]
  

Я хочу выполнить поиск по слову «youtube», и когда оно вернется, приведенный выше текст должен выглядеть следующим образом :

 [span]youtube[span]

[href="youtube.com] i am here , in [span]Youtube[/span]  [/a]
  

Слово youtube, содержащееся в href или в iframe, должно игнорироваться.
На данный момент у меня есть следующий код :

 def m = test =~ /([^<]*)?(youtube)/
println m[0]

def highLightText  = { attrs, body ->
        def postBody = attrs.text
        def m = postBody =~ /(?i:${attrs.searchTerm})/
        def array = []

        m.each{
            array << it as String
        }
        array.unique()

        String result = postBody
        array.each{
            result = result.replaceAll("${it}", "<span class='highlight'>${it}</span>")

        }

        out << result
    }
  

И это возвращает :

 [span]youtube[span]

[href="[span]youtube[span].com] i am here , in [span]Youtube[/span]  [/a]
  

Кто-нибудь может мне помочь с регулярным выражением, которое может выбирать только слова, которые не содержатся в ссылках или других тегах.

Спасибо

Ответ №1:

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

Проанализируйте свой HTML в DOM и рассмотрите только текстовые узлы как подходящие для потенциального выделения. Текстовые узлы по определению будут представлять собой только те фрагменты содержимого, которые отображаются, и не будут именами элементов, атрибутами / значениями атрибутов и так далее.

Затем сложность вашей проблемы сводится к следующему: как мне найти и выделить строку внутри другой строки?