Заменить текст в тегах HTML, кроме атрибутов HTML (регулярное выражение) - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь найти некоторые совпадения с регулярным выражением в строке HTML и заменить их соответствующей специальной разметкой. В приведенной ниже строке примера я хотел бы найти слово swiftsoup и заменить его на <b>swiftsoup</b>, но исключить все совпадения во всех атрибутах, таких как id="swiftsoup" или в href url.

// example string
<p>swiftsoup is awesome, but I don't know how to solve with <a id="swiftsoup" href="https://github.com/scinfu/swiftsoup">swiftsoup</a> or other. Love swiftsoup even so.</p>

Следующий код SwiftSoup, конечно, не работает, потому что ownText() до text() не являются мутирующими функциями и не могут обработать неиспользованный результат replacingOccurrences(of:with:):

let h = #"<p>swiftsoup is awesome, but I don't know how to solve with <a id="swiftsoup" href="https://github.com/scinfu/swiftsoup">swiftsoup</a> or other. Love swiftsoup even so.</p>"#

let p = try! SwiftSoup.parse(h).select("p").first()!

p.ownText().replacingOccurrences(of: "swiftsoup", with: "<b>swiftsoup</b>")
           ^~~~~~

Возможно, может помочь регулярное выражение с html(), но я не знаю, как сохранить совпадения внутри значений атрибута:

extension String {
    func markUpSwiftSoup() -> String {
        var selfResult = self
        let selfAsNSString = self as NSString

        if let regex = try? NSRegularExpression(pattern: "swiftsoup") {

            let range = NSRange(location: 0, length: selfAsNSString.length)
            regex.matches(in: self, options: [], range: range).forEach {

                let match = selfAsNSString.substring(with: $0.range)
                selfResult = selfResult.replacingOccurrences(of: match, with: "<b>\(match)</b>")
            }

            return selfResult

        } else {
            return self
        }
    }
}

var pHTML = try! p.html()
p.html(pHTML.markUpSwiftSoup())

Результат , который я пытаюсь получить , таков:

<p><b>swiftsoup</b> is awesome, but I don't know how to solve with <a id="swiftsoup" href="https://github.com/scinfu/swiftsoup"><b>swiftsoup</b></a> or other. Love <b>swiftsoup</b> even so.</p>

Заранее спасибо!

...