ฉันได้ดูโซลูชันที่ใช้ Regex ที่แนะนำที่นี่แล้วและพวกเขาไม่ได้เติมเต็มความมั่นใจให้ฉันยกเว้นในกรณีที่ไม่สำคัญที่สุด วงเล็บมุมในแอตทริบิวต์คือทั้งหมดที่ต้องใช้ในการทำลายไม่ว่าจะเป็น HTML ที่ปลอมแปลงผิดพลาดจากป่า แล้วเอนทิตี&
ล่ะ? หากคุณต้องการแปลง HTML เป็นข้อความธรรมดาคุณต้องถอดรหัสเอนทิตีด้วย
ผมจึงขอเสนอวิธีด้านล่างนี้
การใช้HtmlAgilityPackวิธีส่วนขยายนี้จะดึงแท็ก HTML ทั้งหมดออกจากส่วน html ได้อย่างมีประสิทธิภาพ ถอดรหัสเอนทิตี HTML เช่น&
. ส่งคืนเฉพาะรายการข้อความภายในโดยมีบรรทัดใหม่ระหว่างแต่ละรายการข้อความ
public static string RemoveHtmlTags(this string html)
{
if (String.IsNullOrEmpty(html))
return html;
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
{
return WebUtility.HtmlDecode(html);
}
var sb = new StringBuilder();
var i = 0;
foreach (var node in doc.DocumentNode.ChildNodes)
{
var text = node.InnerText.SafeTrim();
if (!String.IsNullOrEmpty(text))
{
sb.Append(text);
if (i < doc.DocumentNode.ChildNodes.Count - 1)
{
sb.Append(Environment.NewLine);
}
}
i++;
}
var result = sb.ToString();
return WebUtility.HtmlDecode(result);
}
public static string SafeTrim(this string str)
{
if (str == null)
return null;
return str.Trim();
}
หากคุณจริงจังจริงๆคุณต้องการที่จะไม่สนใจเนื้อหาของแท็ก HTML บางเกินไป ( <script>
, <style>
, <svg>
, <head>
, <object>
มาใจ!) เพราะพวกเขาอาจจะไม่ได้มีเนื้อหาที่อ่านได้ในความรู้สึกที่เรามีความหลัง สิ่งที่คุณทำจะขึ้นอยู่กับสถานการณ์ของคุณและว่าคุณต้องการไปไกลแค่ไหน แต่การใช้ HtmlAgilityPack จะเป็นเรื่องเล็กน้อยสำหรับแท็กที่เลือกในรายการที่อนุญาตหรือบัญชีดำ
หากคุณกำลังแสดงเนื้อหากลับไปที่หน้า HTML ตรวจสอบให้แน่ใจว่าคุณเข้าใจช่องโหว่ของ XSS และวิธีการป้องกันนั่นคือเข้ารหัสข้อความที่ผู้ใช้ป้อนซึ่งจะแสดงผลกลับไปที่หน้า HTML เสมอ ( >
กลายเป็น>
ฯลฯ )