문자열에서 HTML 태그 제거
HTML 태그를 문자열에서 제거하여 깨끗한 텍스트를 출력하려면 어떻게 해야 합니까?
let str = string.stringByReplacingOccurrencesOfString("<[^>]+>", withString: "", options: .RegularExpressionSearch, range: nil)
print(str)
음, 당신의 기능을 시도해 봤는데, 작은 예로 효과가 있었습니다.
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)
HTML은 일반 언어가 아니므로 정규 표현식을 사용할 수 없습니다.참고 항목: 정규식을 사용하여 HTML 구문 분석: 그렇지 않은 이유는 무엇입니까?
대신 NSA 속성 문자열을 사용하는 것을 고려해 보겠습니다.
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)
모하메드 솔루션이지만 Swift 4의 String 확장자입니다.
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
}
}
}
특정 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"
extension String{
var htmlStripped : String{
return self.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil)
}
}
해피 코딩
NSA 속성 String HTML 변환을 사용하는 것보다 정규식을 사용하는 것을 선호합니다. 시간이 많이 걸리고 메인 스레드에서도 실행해야 합니다.자세한 내용은 여기에서 확인하십시오. https://developer.apple.com/documentation/foundation/nsattributedstring/1524613-initwithdata
이것이 저에게 속임수가 되었습니다. 먼저 CSS 인라인 스타일링을 제거하고 나중에 모든 HTML 태그를 제거합니다.NSA 속성 문자열 옵션만큼 견고하지 않을 수도 있지만, 제 경우에는 훨씬 빠릅니다.
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)
}
}
스위프트 5
extension String {
public func trimHTMLTags() -> String? {
guard let htmlStringData = self.data(using: String.Encoding.utf8) else {
return nil
}
let options: [NSAttributedString.DocumentReadingOptionKey : Any] = [
.documentType: NSAttributedString.DocumentType.html,
.characterEncoding: String.Encoding.utf8.rawValue
]
let attributedString = try? NSAttributedString(data: htmlStringData, options: options, documentAttributes: nil)
return attributedString?.string
}
}
사용:
let str = "my html <a href='https://www.google.com'>link text</a>"
print(str.trimHTMLTags() ?? "--") //"my html link text"
swift 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
}
}
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
다음을 사용하여 약간의 성공을 거둘 수 있었습니다.XML
XMLParser를 사용한 이벤트 기반 처리, 의 모든 플랫폼에서 사용 가능Foundation
.
장점
- 이 솔루션은 정규식을 사용하는 것보다 성능이 더 우수합니다.
- 이미 몇몇 사람들이 언급했듯이, 더 안전합니다.
HTML
일반 언어가 아닙니다. - 스레드 세이프(메인 스레드에서 실행할 필요 없음).
단점
HTML
아닙니다XML
비록 그것이 매우 비슷할지라도 당신은 당신의 청소가 필요할지도 모릅니다.HTML
로 해석하기 전에XML
.- 예:
<br>
그리고.<hr>
구문 분석을 실패하게 만들 수 있습니다.<br />
그리고.<hr />
로 구문 분석됩니다.\n
. - 이 API는 대리인 기반 API이므로 다음을 준수해야 합니다.
NSObject
프로토콜 및 이벤트 기반 처리. XMLParser
오랫동안 업데이트되지 않았기 때문에 우리가 원하는 새로운 Swift 기능이 많이 부족합니다.- XMLDocument는 보다 최신이고 유연한 API로 제공됩니다.
Foundation
하지만 macOS에서만 사용할 수 있습니다.
나만의 사용 사례를 위해 나는 내가 사용할 수 있는 클래스를 만들었습니다.async/await
비동기식 처리가 가능합니다.
자신의 사용 사례를 위해 자유롭게 수정하십시오. 원본의 세척 프로세스를 개선할 수 있습니다.HTML
string
해결책
import Foundation
final class Parser: NSObject, XMLParserDelegate {
private(set) var result = ""
private var finished: (() -> Void)?
private var fail: ((Error) -> Void)?
private var content = ""
init(html: String) async throws {
super.init()
result = try await withUnsafeThrowingContinuation { [weak self] continuation in
// tweak here as needed
let clean = html
.replacingOccurrences(of: "<!DOCTYPE html>",
with: "",
options: .caseInsensitive)
.replacingOccurrences(of: "<br>",
with: "\n",
options: .caseInsensitive)
.replacingOccurrences(of: "<hr>",
with: "\n",
options: .caseInsensitive)
let xml = XMLParser(data: .init(("<xml>" + clean + "</xml>").utf8))
self?.finished = { [weak self] in
xml.delegate = nil
self?.fail = nil
self?.finished = nil
guard let content = self?.content else { return }
continuation
.resume(returning: content
.trimmingCharacters(in:
.whitespacesAndNewlines))
}
self?.fail = { [weak self] in
xml.delegate = nil
self?.fail = nil
self?.finished = nil
xml.abortParsing()
continuation
.resume(throwing: $0)
}
xml.delegate = self
if !xml.parse(),
let error = xml.parserError {
self?.fail?(error)
}
}
}
func parserDidEndDocument(_: XMLParser) {
finished?()
}
func parser(_: XMLParser, parseErrorOccurred: Error) {
fail?(parseErrorOccurred)
}
func parser(_: XMLParser, validationErrorOccurred: Error) {
fail?(validationErrorOccurred)
}
func parser(_: XMLParser, foundCharacters: String) {
content += foundCharacters
}
}
사용법 및 예제
이 게시물에 이미 제공된 예 중 일부 사용
let string = "<!DOCTYPE html> <html> <body> <h1>My First Heading</h1> <p>My first paragraph.</p> </body> </html>"
let result = try await Parser(html: string).result
// My First Heading My first paragraph.
let string = "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 result = try await Parser(html: string).result
// LCD Soundsystem was the musical project of producer James Murphy, co-founder of dance-punk label DFA 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 alternative dance and post punk, along with elements of disco and other styles.
let string = "my html <a href=\"\">link text</a>"
let result = try await Parser(html: string).result
// my html link text
언급URL : https://stackoverflow.com/questions/25983558/stripping-out-html-tags-from-a-string
'programing' 카테고리의 다른 글
두 개 이상의 인수에 대한 Numpy '논리적_or' (0) | 2023.08.24 |
---|---|
오류 수정 방법:서버에서 받은 메시지를 구문 분석할 수 없습니다. (0) | 2023.08.24 |
하나의 열이 보기에 다른 데이터 정렬로 끝납니다. (0) | 2023.08.24 |
Git 원격:오류: 치명적: 프로토콜 오류: 잘못된 줄 길이 문자: Unab (0) | 2023.08.24 |
Android에서 읽기 전용 파일 시스템 (0) | 2023.08.24 |