ฉันจะลบแท็ก HTML ทั้งหมดออกจากสตริงโดยไม่ทราบว่ามีแท็กใดอยู่ในนั้นได้อย่างไร


123

มีวิธีง่ายๆในการลบแท็ก HTML ทั้งหมดหรือ HTML ใด ๆ ที่เกี่ยวข้องออกจากสตริงหรือไม่?

ตัวอย่างเช่น:

string title = "<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)"

ข้างต้นควรเป็น:

"มวยปล้ำชิงแชมป์คนดังของฮัลค์โฮแกน [Proj # 206010] (เรียลลิตี้ซีรีส์)"


คำถามนี้ถูกปิดเนื่องจากการทำซ้ำ แต่คำตอบที่แนะนำจะให้โดยใช้ Html Agility Pack หากคุณต้องการที่จะลบแท็กที่มีออกมาใช้ HTML Agility แพ็คคุณสามารถดูคำตอบของฉันที่นี่stackoverflow.com/a/30026043/2318354 ซึ่งอาจเป็นประโยชน์กับบางคน
Dilip0165

6
นี่ไม่ใช่รายการที่ซ้ำกันเนื่องจาก "HTML agility pack - การลบแท็กที่ไม่ต้องการโดยไม่ต้องลบเนื้อหา" ต้องการเก็บแท็กไว้ (เช่นให้รายการแท็กที่ถูกต้องลบส่วนที่เหลือ) คำถามนี้เกี่ยวกับการลบแท็กทั้งหมด และฉันไม่สามารถใช้คำตอบของคำถามอื่นได้เนื่องจากฉันจะไม่ส่งต่อในรายการแท็ก html ทั้งหมดที่มีอยู่
Thierry_S

ลองดูที่xidel มันจะนำคุณ 95% xidel -s input -e '/'ของวิธีการที่นั่นด้วย
Josh Habdas

คำตอบ:


248

คุณสามารถใช้ regex ง่ายๆดังนี้:

public static string StripHTML(string input)
{
   return Regex.Replace(input, "<.*?>", String.Empty);
}

โปรดทราบว่าโซลูชันนี้มีข้อบกพร่องในตัวเอง ดูลบแท็ก HTML ใน Stringสำหรับข้อมูลเพิ่มเติม (โดยเฉพาะความคิดเห็นของ @mehaase)

วิธีการแก้ปัญหาอีกก็จะไปใช้HTML Agility แพ็ค
คุณสามารถดูตัวอย่างการใช้ไลบรารีได้ที่นี่: HTML agility pack - การลบแท็กที่ไม่ต้องการโดยไม่ต้องลบเนื้อหา?


2
ใช้ไม่ได้กับอินพุต: '7 <10 <b> แต่ </b> 30> 10' จะให้: '7 แต่ 30> 10'
Bartosz Pierzchlewicz

ใช่เพราะมันขีดทุกอย่างระหว่าง <และ> ดังนั้นในกรณีของคุณ< 10 <b>และ</b>ทั้งคู่ถูกถอดออก
Bidou

2
ชื่อเมธอดไม่ควรเป็น StripHtml () เนื่องจากชื่อเมธอดควรใช้ Pascal case?
David Klempfner

การใช้นิพจน์ทั่วไปสำหรับสิ่งนี้อาจไม่ใช่ความคิดที่ดีหากคุณใช้เพื่อเหตุผลด้านความปลอดภัย
Mathias Lykkegaard Lorenzen

3
เพียงแค่เปลี่ยนนิพจน์ทั่วไปเป็น <[a-zA-Z /] *?>
Brandon Prudent

54

คุณสามารถแยกวิเคราะห์สตริงโดยใช้Html Agility packและรับ InnerText

    HtmlDocument htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(@"<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)");
    string result = htmlDoc.DocumentNode.InnerText;

ฉันชอบInnerTextวิธีแก้ปัญหาเพราะมันลบแท็กทั้งหมด แต่ ... มันใบหลัง&nbsp;และแท็กความคิดเห็นเช่น<!-- xxx --> เช่นผู้ที่อยู่โดยรอบv:shapetype,v:shapeหรือv:imagedataด้วย[if gte vml 1]หรือ[if !vml]
Thierry_S

7
ฉันรู้ว่า&nbsp;เป็นเอนทิตี html ไม่ใช่แท็กดังนั้นวิธีแก้ปัญหาในการลบresult = WebUtility.HtmlDecode(result);และลบโหนดความคิดเห็นโดยใช้ Html Agility Pack: htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());ก่อนทำresult = htmlDoc.DocumentNode.InnerText;
Thierry_S

3

คุณสามารถใช้รหัสด้านล่างในสตริงของคุณและคุณจะได้รับสตริงที่สมบูรณ์โดยไม่มีส่วน html

string title = "<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)".Replace("&nbsp;",string.Empty);            
        string s = Regex.Replace(title, "<.*?>", String.Empty);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.