2015-01-21 23 views
7

Dưới đây là dòng mã sau đây tôi sử dụng để thay thế thẻ ngắt HTML bằng dấu xuống dòng. Tuy nhiên, tôi có các biểu tượng HTML khác mà tôi cần phải thay thế và khi tôi gọi lại dòng mã này, với các tham số khác nhau, nó giống như thông số đầu tiên bị ghi đè. Có cách nào tôi có thể đưa vào nhiều tham số không? Có cách nào hiệu quả hơn để làm điều này trong Swift? Ví dụ: thay thế cả br> bằng "" và nbsp bằng "".Thay thế nhiều ký tự trong chuỗi

textView.text = content.stringByReplacingOccurrencesOfString("<br /><br />", withString:"\r") 
+0

Hiện làm thế nào bạn "gọi lại dòng mã này". Đó là nơi bạn đang đi sai, sau khi tất cả. – matt

+0

textView.text = content.stringByReplacingOccurrencesOfString ("

", withString: "\ r") textView.text = content.stringByReplacingOccurrencesOfString (" ", withString:" ") –

+0

Nhưng có vấn đề. Bạn đang bắt đầu lại từ nội dung 'gốc'. Văn bản của chế độ xem văn bản bị ghi đè bởi vì _you_ đang ghi đè lên văn bản đó! – matt

Trả lời

5

Khi @matt đề cập bạn bắt đầu lại với cùng một chuỗi content. Phương thức stringByReplacingOccurrencesOfString không thực sự thay đổi bất cứ thứ gì trong chuỗi content gốc. Nó trả về cho bạn một chuỗi mới với những thay đổi thay thế trong khi content vẫn không thay đổi.

Something như thế này nên làm việc cho bạn

let result1 = content.stringByReplacingOccurrencesOfString("<br /><br />", withString:"\r") 
let result2 = result1.stringByReplacingOccurrencesOfString(" &nbsp;", withString:" ") 
textView.text = result2 
1
extension String { 
    var html2AttributedString:NSAttributedString { 
     return NSAttributedString(data: dataUsingEncoding(NSUTF8StringEncoding)!, options:[NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding], documentAttributes: nil, error: nil)! 
    } 
} 

let myHtmlCode = "<style type=\"text/css\">#red{color:#F00}#green{color:#0F0}#blue{color: #00F}</style><span id=\"red\" >Red</span> <span id=\"green\" >Green</span><span id=\"blue\">Blue</span>" 

myHtmlCode.html2AttributedString 
6

Tôi giải quyết nó dựa trên ý tưởng của Rosetta Code

extension String { 
    func stringByRemovingAll(characters: [Character]) -> String { 
     return String(self.characters.filter({ !characters.contains($0) })) 
    } 

    func stringByRemovingAll(subStrings: [String]) -> String { 
     var resultString = self 
     subStrings.map { resultString = resultString.stringByReplacingOccurrencesOfString($0, withString: "") } 
     return resultString 
    } 
} 

Ví dụ:

let str = "Hello, stackoverflow" 
let chars: [Character] = ["a", "e", "i"] 
let myStrings = ["Hello", ", ", "overflow"] 

let newString = str.stringByRemovingAll(chars) 
let anotherString = str.stringByRemovingAll(myStrings) 

Kết quả, khi in :

newString: Hllo, stckovrflow

anotherString: stack

+2

Đây không phải là giải pháp hiệu quả, xem câu trả lời của tôi bằng cách sử dụng CompareOptions.CompareOptions .regularExpression –

+0

@Michael Nhưng tôi đoán điều này làm việc trong các trường hợp chung chung hơn. Nếu chuỗi của tôi không phải là cụm từ thông dụng thì sao? Câu trả lời của bạn sẽ thay đổi như thế nào? –

+0

@KarthikKannan Bạn đang đề cập đến câu trả lời của tôi dưới đây? Bạn đã bình luận trong câu trả lời sai? Nếu có, vui lòng lặp lại câu hỏi trong câu trả lời của tôi để tránh nhầm lẫn với người khác. –

10

Sử dụng replacingOccurrences cùng với các String.CompareOptions.regularExpresion tùy chọn.

Ví dụ (Swift 3): nhân vật

var x = "<Hello, [play^ground+]>" 
let y = x.replacingOccurrences(of: "[\\[\\]^+<>]", with: "7", options: .regularExpression, range: nil) 
print(y) 

Input đó sẽ được thay thế bên trong dấu ngoặc vuông như vậy [\\ Nhân vật]

Output:

7Hello, 7play7ground777 
+0

Điều này thật tuyệt vời và chính xác những gì tôi đang tìm kiếm!Sử dụng tuyệt vời RegEx, thứ mà tôi chưa sử dụng nhiều trong Swift. Cảm ơn câu trả lời tuyệt vời Michael. – Trev14

+0

Bạn có thể giải thích - tôi có nên luôn luôn sử dụng '. RegularExpression' không? Điều gì sẽ xảy ra nếu tôi chỉ cần chỉ định danh sách các biểu tượng cụ thể mà tôi cần phải thay thế/xóa? –

+0

Có thể có các cách khác, tuy nhiên biểu thức chính quy là cách tốt để thể hiện một tập hợp các ký tự cụ thể. Ví dụ: nếu tôi muốn thay thế "A", "B" và "Z", mã sẽ trông giống như: x.replacingOccurrences (of: "[ABZ]", với: "7", tùy chọn: .regularExpression, range : nil) –

Các vấn đề liên quan