Bagaimana cara menggunakan ekspresi reguler C # untuk mengganti / menghapus semua tag HTML, termasuk kurung sudut? Dapatkah seseorang tolong bantu saya dengan kode ini?
Bagaimana cara menggunakan ekspresi reguler C # untuk mengganti / menghapus semua tag HTML, termasuk kurung sudut? Dapatkah seseorang tolong bantu saya dengan kode ini?
Jawaban:
Seperti yang sering dinyatakan sebelumnya, Anda tidak boleh menggunakan ekspresi reguler untuk memproses dokumen XML atau HTML. Mereka tidak berkinerja sangat baik dengan dokumen HTML dan XML, karena tidak ada cara untuk mengekspresikan struktur bersarang secara umum.
Anda bisa menggunakan yang berikut ini.
String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);
Ini akan berfungsi untuk sebagian besar kasus, tetapi akan ada kasus (misalnya CDATA yang mengandung kurung sudut) di mana ini tidak akan berfungsi seperti yang diharapkan.
Jawaban yang benar adalah jangan lakukan itu, gunakan HTML Agility Pack .
Diedit untuk menambahkan:
Untuk mencuri tanpa malu-malu dari komentar di bawah ini oleh jesse, dan untuk menghindari dituduh tidak memadai menjawab pertanyaan setelah selama ini, inilah cuplikan sederhana dan dapat diandalkan menggunakan Paket Agility HTML yang bekerja dengan bit HTML yang paling tidak sempurna pun terbentuk dengan sempurna:
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());
Ada beberapa kasus yang dapat dipertahankan untuk menggunakan ekspresi reguler untuk parsing HTML, karena HTML tidak dapat diurai dengan benar tanpa kesadaran konteks yang sangat menyakitkan untuk diberikan bahkan di mesin regex nontradisional. Anda bisa mendapatkan sebagian jalan di sana dengan RegEx, tetapi Anda harus melakukan verifikasi manual.
Html Agility Pack dapat memberikan Anda solusi tangguh yang akan mengurangi kebutuhan untuk memperbaiki secara manual penyimpangan yang dapat terjadi akibat memperlakukan HTML secara naif sebagai tata bahasa bebas konteks.
Ekspresi reguler mungkin memberi Anda sebagian besar apa yang paling Anda inginkan, tetapi akan gagal pada kasus yang sangat umum. Jika Anda dapat menemukan parser yang lebih baik / lebih cepat daripada HTML Agility Pack, lakukan itu, tapi tolong jangan membuat dunia peretasan HTML yang lebih rusak.
Pertanyaannya terlalu luas untuk dijawab secara definitif. Apakah Anda berbicara tentang menghapus semua tag dari dokumen HTML dunia nyata, seperti halaman web? Jika demikian, Anda harus:
Itu hanya di atas kepala saya - saya yakin masih ada lagi. Setelah Anda melakukan semua itu, Anda akan berakhir dengan kata-kata, kalimat dan paragraf berjalan bersama di beberapa tempat, dan potongan besar spasi kosong yang tidak berguna di tempat lain.
Tapi, dengan anggapan Anda bekerja hanya dengan sebuah fragmen dan Anda dapat menghapus hanya dengan menghapus semua tag, inilah regex yang akan saya gunakan:
@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"
Mencocokkan string dengan kutip tunggal dan ganda dalam alternatifnya sendiri sudah cukup untuk mengatasi masalah kurung sudut dalam nilai atribut. Saya tidak melihat ada kebutuhan untuk secara eksplisit mencocokkan nama atribut dan hal-hal lain di dalam tag, seperti regex dalam jawaban Ryan; alternatif pertama menangani semua itu.
Jika Anda bertanya-tanya tentang (?>...)
konstruksi itu, mereka adalah kelompok atom . Mereka membuat regex sedikit lebih efisien, tetapi yang lebih penting, mereka mencegah pelarian mundur, yang merupakan sesuatu yang harus selalu Anda perhatikan ketika Anda mencampur pergantian dan pengukur bersarang seperti yang telah saya lakukan. Saya tidak benar-benar berpikir itu akan menjadi masalah di sini, tetapi saya tahu jika saya tidak menyebutkannya, orang lain akan melakukannya. ;-)
Regex ini tidak sempurna, tentu saja, tetapi mungkin sebaik yang Anda butuhkan.
Regex regex = new Regex(@"</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>", RegexOptions.Singleline);
@JasonTrue benar, bahwa pengupasan tag HTML tidak boleh dilakukan melalui ekspresi reguler.
Cukup mudah untuk menghapus tag HTML menggunakan HtmlAgilityPack:
public string StripTags(string input) {
var doc = new HtmlDocument();
doc.LoadHtml(input ?? "");
return doc.DocumentNode.InnerText;
}
Saya ingin mengulangi tanggapan Jason meskipun terkadang Anda perlu mengurai beberapa Html secara naif dan mengeluarkan konten teks.
Saya perlu melakukan ini dengan beberapa Html yang telah dibuat oleh editor teks kaya, selalu menyenangkan dan permainan.
Dalam hal ini, Anda mungkin perlu menghapus konten beberapa tag serta hanya tag itu sendiri.
Dalam kasus saya dan tag dilemparkan ke dalam campuran ini. Seseorang mungkin menganggap implementasi saya (sangat sedikit) kurang naif sebagai titik awal yang berguna.
/// <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>
dengan RegexOptions.SingleLine
pengubah untuk dua yang pertama dan <[^>]*>
yang terakhir. Yang pertama juga dapat digabungkan dengan pergantian yang diambil pada nama tag pertama dan referensi kembali ke sana di lookahead negatif dan tag akhir.
coba metode ekspresi reguler di URL ini: 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);
}
Gunakan metode ini untuk menghapus tag:
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, ""));
}