एक स्ट्रिंग से HTML टैग्स को अलग करना


95

मैं एक स्ट्रिंग से HTML टैग कैसे निकालूं ताकि मैं स्वच्छ पाठ का उत्पादन कर सकूं?

let str = string.stringByReplacingOccurrencesOfString("<[^>]+>", withString: "", options: .RegularExpressionSearch, range: nil)
print(str)


1
नेतृत्व में, इस सवाल का बहुत मूल्य है लेकिन जैसा कि है, यह बंद होने की संभावना है क्योंकि आप एक स्पष्ट सवाल नहीं पूछते हैं: यह एक गैर-प्रतिलिपि प्रस्तुत करने योग्य परिदृश्य है। मेरा सुझाव है कि आप कैसे पूछें के अनुसार अपने सवाल को फिर से लिखना । मैं नहीं चाहता कि यह प्रश्न हटा दिया जाए।
तुनकी

3
योग्य स्टैकओवरफ़्लो ... यह "ऑफ टॉपिक" के रूप में कैसे बंद है? यह "स्विफ्ट निकालें HTML टैग्स" के लिए # 1 Google परिणाम है।
कान्हाबिट्स

2
@canhazbits मुझे सही पता है! इसे फिर से खोलने के लिए नामांकित करने के लिए फिर से खोलें पर क्लिक करें।
एलईडी

1
स्विफ्ट 3: string.replacingOccurrences (of: "<[^ ^] +>", के साथ: "", विकल्प:। अनियमितExpression, रेंज: nil)
etayluz

जवाबों:


147

हम्म, मैंने आपके कार्य की कोशिश की और इसने एक छोटे से उदाहरण पर काम किया:

var string = "<!DOCTYPE html> <html> <body> <h1>My First Heading</h1> <p>My first paragraph.</p> </body> </html>"
let str = string.stringByReplacingOccurrencesOfString("<[^>]+>", withString: "", options: .RegularExpressionSearch, range: nil)
print(str)

//output "  My First Heading My first paragraph. "

क्या आप किसी समस्या का उदाहरण दे सकते हैं?

स्विफ्ट 4 और 5 संस्करण:

var string = "<!DOCTYPE html> <html> <body> <h1>My First Heading</h1> <p>My first paragraph.</p> </body> </html>"
let str = string.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)

25
<LOL> हा हा! </ LOL>
स्टीव रोसेनबर्ग


1
उदाहरण के लिए, HTML के इस टुकड़े को आज़माएं:<p foo=">now what?">Paragraph</p>
पैरामैग्नेटिक क्रोइसैंट

32
स्विफ्ट 3 में string.replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil)
हुसम

5
स्विफ्ट 4 string.replacingOccurrences (में: "<[^ ^] +>", के साथ: "", विकल्प:। अनियमितExpression, रेंज: nil)
Raegtime

29

चूंकि HTML एक नियमित भाषा नहीं है (HTML एक संदर्भ-मुक्त भाषा है), आप नियमित अभिव्यक्ति का उपयोग नहीं कर सकते। देखें: HTML को पार्स करने के लिए नियमित अभिव्यक्तियों का उपयोग करना: क्यों नहीं?

मैं इसके बजाय NSAttributedString का उपयोग करने पर विचार करूंगा।

let htmlString = "LCD Soundsystem was the musical project of producer <a href='http://www.last.fm/music/James+Murphy' class='bbcode_artist'>James Murphy</a>, co-founder of <a href='http://www.last.fm/tag/dance-punk' class='bbcode_tag' rel='tag'>dance-punk</a> label <a href='http://www.last.fm/label/DFA' class='bbcode_label'>DFA</a> Records. Formed in 2001 in New York City, New York, United States, the music of LCD Soundsystem can also be described as a mix of <a href='http://www.last.fm/tag/alternative%20dance' class='bbcode_tag' rel='tag'>alternative dance</a> and <a href='http://www.last.fm/tag/post%20punk' class='bbcode_tag' rel='tag'>post punk</a>, along with elements of <a href='http://www.last.fm/tag/disco' class='bbcode_tag' rel='tag'>disco</a> and other styles. <br />"    
let htmlStringData = htmlString.dataUsingEncoding(NSUTF8StringEncoding)!
let options: [String: AnyObject] = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding]
let attributedHTMLString = try! NSAttributedString(data: htmlStringData, options: options, documentAttributes: nil)
let string = attributedHTMLString.string

या, जैसा कि टिप्पणी में इरशाद मोहम्मद करेंगे:

let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
print(attributed.string)

7
यह सबसे साफ तरीका लगता है और यह बेहतरीन तरीके से काम करता है! यह सबसे अच्छा है कि युद्ध-परीक्षण वाले फाउंडेशन ढांचे को आप के लिए संभाल कर रख दें, बजाय इसके कि आप अपने आप पर परतदार परसन लिख लें।
श्याम भाट

4
स्वच्छ!! let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)ज्यादातर लोग ऐसे उत्तर चुनना पसंद करते हैं जो छोटे और समझने में आसान हों।
इरशाद मोहम्मद

1
समाधान के लिए धन्यवाद! क्या हम html टैग हटाते समय रिक्त स्थान और लाइन ब्रेक को सहेजना संभव है? वर्तमान में, सभी लाइन ब्रेक नए स्ट्रिंग में अवहेलना कर रहे हैं।
आस्था गुप्ता

7
बस इसका उपयोग करते हुए एक चेतावनी: HTML शैली परिवर्तित (जिम्मेदार) धीमी! । WWDC के एक CoreText इंजीनियर ने मुझे बताया कि यह अब कायम नहीं है और वह इसके बारे में पूरी तरह से भूल गया था।
सायरन

1
पिछली चेतावनी के बारे में बस एक चेतावनी: चलो कुछ डेटा को देखने से पहले हम "धीमा" होने के लिए एक विधि को छोड़ देते हैं। आपके द्वारा उपयोग किए जाने वाले बहुत से पुस्तकालय हैं (अक्सर इसे साकार किए बिना) जिन्हें बहुत अधिक रखरखाव की आवश्यकता नहीं होती है। जरूरी नहीं कि वह बुरी चीज हो।
जॉनी

10

मोहम्मद समाधान लेकिन स्विफ्ट 4 में एक स्ट्रिंग विस्तार के रूप में।

extension String {

    func stripOutHtml() -> String? {
        do {
            guard let data = self.data(using: .unicode) else {
                return nil
            }
            let attributed = try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
            return attributed.string
        } catch {
            return nil
        }
    }
}

8

मैं विशिष्ट HTML तत्वों को निकालने के लिए निम्नलिखित एक्सटेंशन का उपयोग कर रहा हूं:

extension String {
    func deleteHTMLTag(tag:String) -> String {
        return self.stringByReplacingOccurrencesOfString("(?i)</?\(tag)\\b[^<]*>", withString: "", options: .RegularExpressionSearch, range: nil)
    }

    func deleteHTMLTags(tags:[String]) -> String {
        var mutableString = self
        for tag in tags {
            mutableString = mutableString.deleteHTMLTag(tag)
        }
        return mutableString
    }
}

यह केवल <a>एक स्ट्रिंग से टैग हटाने के लिए संभव बनाता है , जैसे:

let string = "my html <a href="">link text</a>"
let withoutHTMLString = string.deleteHTMLTag("a") // Will be "my  html link text"

@Mr Lister वहाँ सभी HTML टैग को हटाने और इस <a href=""> लिंक पाठ </a> को रखने का एक तरीका है?
Mazen Kasser


3

स्विफ्ट 4:

extension String {
    func deleteHTMLTag(tag:String) -> String {
        return self.replacingOccurrences(of: "(?i)</?\(tag)\\b[^<]*>", with: "", options: .regularExpression, range: nil)
    }

    func deleteHTMLTags(tags:[String]) -> String {
        var mutableString = self
        for tag in tags {
            mutableString = mutableString.deleteHTMLTag(tag: tag)
        }
        return mutableString
    }
}

2
या आप इस तरह का उपयोग कर सकते हैं: func deleteHTMLTag () -> स्ट्रिंग {वापसी self.replacingOccurrences (of: "(i) </? \\ b [^ <] *>", के साथ: "", विकल्प: अनियमितExpression। , रेंज: नील)}
अनिल कुमार

यह रेगेक्स मेरे लिए html कोड को स्ट्रिप नहीं करता है। उदाहरण स्ट्रिंग: "<b> बिल्ली जैसा </ b> कुछ कर रहा है"। काम न करने के कारण की अधिक जाँच नहीं की। लेकिन text.replacingOccurrences (of: "<[^>] +>", ....) मेरे सरल मामलों के लिए काम करता है।
बेंजामिन पीटर

2

स्विफ्ट 4 के लिए अपडेट किया गया:

guard let htmlStringData = htmlString.data(using: .unicode) else { fatalError() }

let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
                .documentType: NSAttributedString.DocumentType.html
                .characterEncoding: String.Encoding.unicode.rawValue
             ]

let attributedHTMLString = try! NSAttributedString(data: htmlStringData, options: options, documentAttributes: nil)
let string = attributedHTMLString.string

आपको एक याद आ रही है, '
.documentType

0

मैं NSAttributedString HTML रूपांतरण का उपयोग करने की तुलना में एक नियमित अभिव्यक्ति का उपयोग करना पसंद करता हूं, सलाह दी जाती है कि बहुत समय लगता है और मुख्य धागे पर भी चलाने की आवश्यकता है। अधिक जानकारी यहाँ: https://developer.apple.com/documentation/foundation/nsattributedstring/1524613-initwithdata

मेरे लिए यह ट्रिक बनी, पहले मैं किसी भी सीएसएस इनलाइन स्टाइल को हटाता हूं, और बाद में सभी HTML टैग। शायद NSAttributedString विकल्प के रूप में ठोस नहीं है, लेकिन मेरे मामले के लिए तेजी से रास्ता।

extension String {
    func withoutHtmlTags() -> String {
        let str = self.replacingOccurrences(of: "<style>[^>]+</style>", with: "", options: .regularExpression, range: nil)
        return str.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.