Làm cách nào để sử dụng biểu thức chính quy C # để thay thế / xóa tất cả các thẻ HTML, bao gồm cả dấu ngoặc nhọn? Ai đó có thể vui lòng giúp tôi với mã?
Làm cách nào để sử dụng biểu thức chính quy C # để thay thế / xóa tất cả các thẻ HTML, bao gồm cả dấu ngoặc nhọn? Ai đó có thể vui lòng giúp tôi với mã?
Câu trả lời:
Như thường được nói trước đây, bạn không nên sử dụng các biểu thức thông thường để xử lý các tài liệu XML hoặc HTML. Chúng không hoạt động tốt với các tài liệu HTML và XML, vì không có cách nào để diễn tả các cấu trúc lồng nhau một cách chung chung.
Bạn có thể sử dụng như sau.
String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);
Điều này sẽ hoạt động trong hầu hết các trường hợp, nhưng sẽ có trường hợp (ví dụ CDATA chứa dấu ngoặc góc) trong đó điều này sẽ không hoạt động như mong đợi.
Câu trả lời đúng là không làm điều đó, hãy sử dụng Gói Agility HTML .
Chỉnh sửa để thêm:
Để đánh cắp một cách đáng xấu hổ từ bình luận bên dưới của jlie và để tránh bị buộc tội trả lời không đầy đủ câu hỏi sau tất cả thời gian này, đây là đoạn trích đơn giản, đáng tin cậy bằng cách sử dụng Gói Agility HTML hoạt động với các bit mã hóa hình thành không hoàn hảo nhất của HTML:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(Properties.Resources.HtmlContents);
var text = doc.DocumentNode.SelectNodes("//body//text()").Select(node => node.InnerText);
StringBuilder output = new StringBuilder();
foreach (string line in text)
{
output.AppendLine(line);
}
string textOnly = HttpUtility.HtmlDecode(output.ToString());
Có rất ít trường hợp có thể phòng thủ được khi sử dụng biểu thức chính quy để phân tích cú pháp HTML, vì HTML không thể được phân tích cú pháp chính xác mà không có nhận thức ngữ cảnh rất đau đớn để cung cấp ngay cả trong một công cụ regex không điều kiện. Bạn có thể nhận được một phần cách đó với RegEx, nhưng bạn sẽ cần phải xác minh thủ công.
Html Agility Pack có thể cung cấp cho bạn một giải pháp mạnh mẽ giúp giảm nhu cầu sửa lỗi quang sai có thể xảy ra do xử lý HTML một cách ngây thơ như một ngữ pháp không ngữ cảnh.
Một biểu thức thông thường có thể giúp bạn có được hầu hết những gì bạn muốn hầu hết thời gian, nhưng nó sẽ thất bại trong các trường hợp rất phổ biến. Nếu bạn có thể tìm thấy trình phân tích cú pháp tốt hơn / nhanh hơn HTML Agility Pack, hãy tìm nó, nhưng vui lòng không khiến thế giới bị tấn công nhiều hơn với tin tặc HTML.
Câu hỏi quá rộng để được trả lời dứt khoát. Bạn đang nói về việc xóa tất cả các thẻ khỏi tài liệu HTML trong thế giới thực, như trang web? Nếu vậy, bạn sẽ phải:
Đó chỉ là trên đỉnh đầu của tôi - Tôi chắc chắn có nhiều hơn nữa. Khi bạn đã thực hiện tất cả những điều đó, bạn sẽ kết thúc bằng các từ, câu và đoạn văn chạy cùng nhau ở một số nơi và các khoảng trống lớn vô dụng ở những nơi khác.
Nhưng, giả sử bạn đang làm việc chỉ với một đoạn và bạn có thể thoát khỏi chỉ bằng cách xóa tất cả các thẻ, đây là regex tôi sẽ sử dụng:
@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"
Việc kết hợp các chuỗi trích dẫn đơn và kép trong các lựa chọn thay thế của chúng là đủ để giải quyết vấn đề về dấu ngoặc góc trong các giá trị thuộc tính. Tôi không thấy bất kỳ nhu cầu nào phải khớp rõ ràng tên thuộc tính và các thứ khác trong thẻ, giống như biểu thức chính thức trong câu trả lời của Ryan; sự thay thế đầu tiên xử lý tất cả điều đó.
Trong trường hợp bạn đang tự hỏi về những (?>...)
cấu trúc đó, chúng là các nhóm nguyên tử . Chúng làm cho regex hiệu quả hơn một chút, nhưng quan trọng hơn, chúng ngăn chặn việc quay lại chạy trốn, đó là điều bạn nên luôn luôn đề phòng khi trộn lẫn các bộ lượng tử xen kẽ và lồng nhau như tôi đã làm. Tôi thực sự không nghĩ rằng đó sẽ là một vấn đề ở đây, nhưng tôi biết nếu tôi không đề cập đến nó, người khác sẽ làm. ;-)
Regex này không hoàn hảo, tất nhiên, nhưng nó có thể tốt như bạn cần.
Regex regex = new Regex(@"</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>", RegexOptions.Singleline);
@JasonTrue là chính xác, việc tước thẻ HTML không nên được thực hiện thông qua các biểu thức thông thường.
Khá đơn giản để loại bỏ các thẻ HTML bằng HtmlAgilityPack:
public string StripTags(string input) {
var doc = new HtmlDocument();
doc.LoadHtml(input ?? "");
return doc.DocumentNode.InnerText;
}
Tôi muốn lặp lại phản hồi của Jason mặc dù đôi khi bạn cần ngây thơ phân tích một số Html và lấy ra nội dung văn bản.
Tôi cần phải làm điều này với một số Html đã được tạo bởi một trình soạn thảo văn bản phong phú, luôn vui vẻ và trò chơi.
Trong trường hợp này, bạn có thể cần phải xóa nội dung của một số thẻ cũng như chính các thẻ đó.
Trong trường hợp của tôi và các thẻ đã được ném vào hỗn hợp này. Một số người có thể thấy việc triển khai ít ngây thơ của tôi (một chút) là điểm khởi đầu hữu ích.
/// <summary>
/// Removes all html tags from string and leaves only plain text
/// Removes content of <xml></xml> and <style></style> tags as aim to get text content not markup /meta data.
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string HtmlStrip(this string input)
{
input = Regex.Replace(input, "<style>(.|\n)*?</style>",string.Empty);
input = Regex.Replace(input, @"<xml>(.|\n)*?</xml>", string.Empty); // remove all <xml></xml> tags and anything inbetween.
return Regex.Replace(input, @"<(.|\n)*?>", string.Empty); // remove any tags but not there content "<p>bob<span> johnson</span></p>" becomes "bob johnson"
}
<xml>.*(?!</xml>)</xml>
với công cụ RegexOptions.SingleLine
sửa đổi cho hai cái đầu tiên và <[^>]*>
cái cuối cùng. Những cái đầu tiên cũng có thể được kết hợp bởi một sự thay thế được chụp trong tên thẻ đầu tiên và phản hồi cho nó trong cái nhìn tiêu cực và thẻ cuối cùng.
thử phương thức biểu thức chính quy tại URL này: http://www.dotnetperls.com/remove-html-tags
/// <summary>
/// Remove HTML from string with Regex.
/// </summary>
public static string StripTagsRegex(string source)
{
return Regex.Replace(source, "<.*?>", string.Empty);
}
/// <summary>
/// Compiled regular expression for performance.
/// </summary>
static Regex _htmlRegex = new Regex("<.*?>", RegexOptions.Compiled);
/// <summary>
/// Remove HTML from string with compiled Regex.
/// </summary>
public static string StripTagsRegexCompiled(string source)
{
return _htmlRegex.Replace(source, string.Empty);
}
Sử dụng phương pháp này để xóa thẻ:
public string From_To(string text, string from, string to)
{
if (text == null)
return null;
string pattern = @"" + from + ".*?" + to;
Regex rx = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
MatchCollection matches = rx.Matches(text);
return matches.Count <= 0 ? text : matches.Cast<Match>().Where(match => !string.IsNullOrEmpty(match.Value)).Aggregate(text, (current, match) => current.Replace(match.Value, ""));
}