Ich habe die folgende Funktion zu finden und markieren Sie Hashtags oder erwähnt (@ oder #) in einer UILabel
:Wie markiere ich Text in einer Zeichenfolge, die Emojis in Swift enthält?
class func addLinkAttribute(pattern: String,
toText text: String,
withAttributeName attributeName : String,
toAttributedString attributedString :NSMutableAttributedString,
withLinkAttributes linkAttributes: [NSObject : AnyObject]) {
var error: NSError?
if let regex = NSRegularExpression(pattern: pattern, options:.CaseInsensitive, error: &error) {
regex.enumerateMatchesInString(text, options: .allZeros, range: NSMakeRange(0, count(text))) { result, flags, stop in
let range = result.range
let start = advance(text.startIndex, range.location)
let end = advance(start, range.length)
let foundText = text.substringWithRange(Range<String.Index>(start: start,end: end))
var linkAttributesWithName = linkAttributes
linkAttributesWithName[attributeName] = foundText
attributedString.addAttributes(linkAttributesWithName, range: range)
}
}
}
Wenn ich einen Hashtag (#)(\\w+)
oder erwähnen (@)(\\w+)
Muster übergeben Sie den Code perfekt funktioniert, aber wenn der Text ein enthält emoji der Bereich durch die Anzahl der Emojis versetzt vorhergehenden es:
I Swift behandelt Strings anders zu Objective-C kennen, da count(string)
und count(string.utf16)
geben mir andere Ergebnisse, aber ich bin ratlos, wie dies bei Verwendung eines regulären Ausdrucks zu berücksichtigen ist.
Ich könnte nur den Unterschied zwischen den 2 Zählern überprüfen und den Bereich ausgleichen, aber das scheint falsch und hacky zu mir. Es muss einen anderen Weg geben.
Funktioniert perfekt! Vielen Dank. Ich bin mir sicher, dass es einen Weg gibt, dies zu tun, ohne sich auf 'NSString' zu verlassen, aber das funktioniert und ich glaube nicht, dass' NSString' bald irgendwo hin geht. –
@MichaelGaylord: Du hast meinen Ehrgeiz erregt, siehe aktualisierte Antwort :) –
@MartinR genial! Danke für das Teilen! funktioniert wie ein Charme! – Andres