文字列からHTMLタグを取り除く


95

クリーンなテキストを出力できるように、HTMLタグを文字列から削除するにはどうすればよいですか?

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


1
この質問には多くの価値がありますが、現状のままでは、明確な質問をしないため、終了する可能性があります。これは再現不可能なシナリオです。「質問方法」に従って質問を言い換えることをお勧めします。その質問を削除したくありません。
Tunaki 2016年

3
lol stackoverflow ...これは「オフトピック」としてどのように閉じられますか?これは、「Swift remove html tags」の#1 google結果です。
canhazbits 2016年

2
@canhazbitsわかってるよ!再度開くには、[再開く]をクリックして指名します。
2016年

1
Swift 3:string.replacingOccurrences(of: "<[^>] +>"、with: ""、options:.regularExpression、range: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. "

問題の例を挙げていただけますか?

Swift 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
Swift 3 string.replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil)
Husam

5
Swift 4でstring.replacingOccurrences(of: "<[^>] +>"、with: ""、options:.regularExpression、range: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

または、コメントのIrshad Mohamedがそうするように:

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

7
これは最もクリーンなアプローチのようで、見事に機能します!独自にフレークパーサーを作成するのではなく、バトルテスト済みのFoundationフレームワークでこれを処理することをお勧めします。
Shyam Bhat 2016年

4
掃除!!let attributed = try NSAttributedString(data: htmlString.data(using: .unicode)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) print(attributed.string)ほとんどの人は、小さくて理解しやすい答えを選ぶことを好みます。
Irshad Mohamed

1
解決策をありがとう!HTMLタグを削除するときにスペースと改行を保存することは可能ですか?現在、すべての改行は新しい文字列では無視されます。
Astha Gupta 2017

7
これを使用した警告:HTMLスタイルの変換(属性)が遅い!。WWDCのCoreTextエンジニアは、これはもはやメンテナンスされておらず、完全に忘れていたと語っています。
サイレン2017

1
前の警告に関する警告:「遅すぎる」メソッドを破棄する前に、いくつかのデータを見てみましょう。多くのメンテナンスを必要としない、多くのCライブラリが使用されています(多くの場合、それを認識せずに)。それは必ずしも悪いことではありません。
ジョニー

10

Mohamedソリューションですが、Swift 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

6
extension String{
    var htmlStripped : String{
        return self.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)
    }
}

ハッピーコーディング


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()-> String {return self.replacingOccurrences(of: "(?i)</?\\ b [^ <] *>"、with: ""、options:.regularExpression 、範囲:nil)}
Anil Kumar

この正規表現は、htmlコードを削除しません。文字列の例:「<b>猫は何かをしている</ b>」。機能しない理由のため、これ以上調査しませんでした。しかし、text.replacingOccurrences(of: "<[^>] +>"、....)は、私の単純なケースで機能します。
ベンジャミンピエット2018年

2

Swift 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:paramの後に「、」がありません
cwgso

0

私はNSAttributedString HTML変換を使用するよりも正規表現を使用することを好みます。これはかなり時間がかかり、メインスレッドでも実行する必要があることに注意してください。詳細はこちら:https : //developer.apple.com/documentation/foundation/nsattributedstring/1524613-initwithdata

私にとってこれはトリックを作りました、最初にCSSインラインスタイルを削除し、その後すべての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)
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.