在索引处将字符串插入字符串(快速)

时间:2018-07-17 06:49:30

标签: html swift string insert substring

我有一个带有一些HTML标记的文本。像这样:

Lorem lipsum <a href="www.example.com"> lorem lipsum.

我想在HTML标记的末尾插入文本style=\"text-decoration: none\,以便链接没有下划线。

我有一个找到HTML标记的正则表达式模式:<\s*a[^>]*>(.*?)<\s*/\s*a>

我有以下代码来获取段落文本中的正则表达式匹配项并计算HTML标记中最后一个字符的位置:

let range = NSRange(location: 0, length: paragraph.utf16.count)
let regex = try! NSRegularExpression(pattern: "<\\s*a[^>]*>(.*?)<\\s*/\\s*a>")
let allMatches = regex.matches(in: paragraph, options: [], range: range)
let lastCharacter = allMatches[0].range.location + allMatches[0].range.length

如何在该位置插入字符串style=\"text-decoration: none\

我尝试过这样的事情:

let newParagraph = paragraph.insert(" style=\"text-decoration: none\"", at: lastCharacter)

但是Xcode指出insert方法中的第一个参数必须是字符,而不是字符串。

1 个答案:

答案 0 :(得分:1)

在我的解决方案中,我使用正则表达式查找<>之间的所有内容,以查找整个HTML标签。找到标签后,我使用replacingOccurrences(of:with:)方法

  1. 用附加的style=属性(加上结束括号)替换结束标签的括号,以创建修改后的标签,
  2. 用修改后的标签替换原始标签。

这是代码:

let string = "Lorem lipsum <a href=\"www.example.com\"> lorem lipsum <a href=\"www.somewhereelse.com\"> dolor sit amet."
let insertString = " style=\"text-decoration: none\">"
var modifiedString = string

let regex = try! NSRegularExpression(pattern: "<.*?>")
let range = NSRange(string.startIndex..., in: string)
let matches = regex.matches(in: string, range: range)
let tags = matches.map { String(string[Range($0.range, in: string)!]) }

for tag in tags {
    let newTag = tag.replacingOccurrences(of: ">", with: insertString)
    modifiedString = modifiedString.replacingOccurrences(of: tag, with: newTag)
}

print(modifiedString)

更新的代码现在根据需要使用循环将所有标签替换为增强的标签。为此,您必须将正则表达式更改为非贪婪:<.*?>而非<.*>