2017-07-05 3 views

Antwort

1
extension NSAttributedString { 

    func replaceHTMLTag(tag: String, withAttributes attributes: [String: AnyObject]) -> NSAttributedString { 
     let openTag = "<\(tag)>" 
     let closeTag = "</\(tag)>" 

     let resultingText: NSMutableAttributedString = self.mutableCopy() as! NSMutableAttributedString 
     while true { 
      let plainString = resultingText.string as NSString 
      let openTagRange = plainString.range(of: openTag) 
      if openTagRange.length == 0 { 
       break 
      } 

      let affectedLocation = openTagRange.location + openTagRange.length 

      let searchRange = NSRange(location: affectedLocation, length: plainString.length - affectedLocation) 

      let closeTagRange = plainString.range(of: closeTag, options: NSString.CompareOptions.init(rawValue: 0), range: searchRange) 

      resultingText.setAttributes(attributes, range: NSRange(location: affectedLocation, length: closeTagRange.location - affectedLocation)) 
      resultingText.deleteCharacters(in: closeTagRange) 
      resultingText.deleteCharacters(in: openTagRange) 
     } 
     return resultingText as NSAttributedString 
    } 
} 
+0

ich folgende Fehlermeldung erhalten mit Xcode9 (Swift4): Kann nicht Wert vom Typ umwandeln ‚[String: ANYOBJECT]‘ zum erwarteten Argumenttyp '[NSAttributedStringKey: Any]?' Gelöst mit: https://stackoverflow.com/questions/45695286/cannot-convert-value-of-type-string-anyobject-to-expected-argument-type – Dorad

0

Sie müssen die^und $ -Anker entfernen.

Das^bedeutet Start der Zeichenfolge und $ bedeutet Ende der Zeichenfolge (oder Zeile, abhängig von den Optionen). Deshalb funktioniert dein erstes Beispiel: In der ersten Testzeichenkette folgt dem Beginn des Strings wirklich dein Muster und endet damit.

In der zweiten Testzeichenfolge wird das Muster in der Mitte der Zeichenfolge gefunden, daher kann das^... nicht angewendet werden. Wenn Sie nur das^entfernen würden, würde das $ beim zweiten Auftreten der Registrierungsnummer gelten und die Ausgabe wäre mein Auto reg 1 - DD11 AAA mein Auto reg 2 - XX.

let myString = "my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB" 
let regex = try! NSRegularExpression(pattern: "([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}", options:  NSRegularExpressionOptions.CaseInsensitive) 
let range = NSMakeRange(0, myString.characters.count) 
let modString = regex.stringByReplacingMatchesInString(myString, options: [], range: range, withTemplate: "XX") 
print(modString) 
// Output: "my car reg 1 - XX my car reg 2 - XX" 

Referenz: https://stackoverflow.com/a/28503676/8169585

0

diese Erweiterung Versuchen. Es konvertiert die HTML-Zeichenfolge in NSAttributtedString. Ich wird auch das 0,75-Verhältnis angewandt aufgrund der Tatsache, dass die Standard-Konvertierung erhöht all die Schriftgröße

extension String { 
    func htmlAttributedString() -> NSAttributedString? { 
     guard let data = self.data(using: String.Encoding.utf16, allowLossyConversion: false) else { return nil } 
     guard let html = try? NSMutableAttributedString(
      data: data, 
      options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], 
      documentAttributes: nil) else { return nil } 
     html.beginEditing() 
     html.enumerateAttribute(NSFontAttributeName, in: NSMakeRange(0, html.length), options: .init(rawValue: 0)) { 
      (value, range, stop) in 
      if let font = value as? UIFont { 
       let resizedFont = font.withSize(font.pointSize * 0.75) 
       html.addAttribute(NSFontAttributeName, 
             value: resizedFont, 
             range: range) 
      } 
     } 
     html.endEditing() 
     return html 
    } 
} 
Verwandte Themen