Ответы пользователя по тегу Swift
  • Как вывести правильный NSRange с NSAttributedString если NSAttributedString инициализирован с Data(HTML)?

    @tiger_13 Автор вопроса
    Как вариант - использовать regex, с помощью которого найти что написано в <p>из отображаемого текста (ищем в String, инициализированным с data(html), то есть видим все теги), и искать этот текст в attributed.string:
    //1
        private func getRangeFor(attributedString:String,aValue:String) -> NSRange?{
            guard let aWord = self.findAWords(aValue: aValue),let foundRange = attributedString.range(of: aWord) else {return nil}//ищем aWord - то, что записано в <p>, затем ищем уже range в attributedString(отрендеренный HTML)
            return NSRange(foundRange, in: attributedString)
        }
        
        //2
        private func findAWords(aValue:String) -> String?{
            guard let data = self.HTMLdata,let str = String(data: data, encoding: .utf8) else {return nil}
            
            
            let pattern = #"<p class=main-text><a name="\#(aValue)"></a>\n<span class=main-text-span>(?<paragraph>.+)</span>"#
            let regexRange = NSRange(location: 0, length: str.utf16.count)
            let regex = try! NSRegularExpression(pattern: pattern)
            let regexResult = regex.firstMatch(in: str, options: [], range: regexRange)
            guard let matchedWordRange = regexResult?.range(withName: "paragraph"), let wordRange = Range(matchedWordRange, in: str) else {return nil}
            return String(str[wordRange]) //вернет слово (Название), нужно дописать regex, чтобы была вторая группа - слово ( абзаца)
        }
    Ответ написан
    Комментировать