Bagaimana Anda mengonversi HTML menjadi teks biasa?

99

Saya memiliki potongan Html yang disimpan dalam sebuah tabel. Bukan seluruh halaman, tanpa tag atau sejenisnya, hanya pemformatan dasar.

Saya ingin menampilkan Html itu sebagai teks saja, tanpa pemformatan , pada halaman tertentu (sebenarnya hanya 30 - 50 karakter pertama tetapi itu bagian yang mudah).

Bagaimana cara menempatkan "teks" di dalam Html itu ke dalam string sebagai teks lurus?

Jadi potongan kode ini.

<b>Hello World.</b><br/><p><i>Is there anyone out there?</i><p>

Menjadi:

Halo Dunia. Apa ada orang di luar sana?

Stuart Helwig
sumber
Anda mungkin ingin menggunakan SgmlReader. code.msdn.microsoft.com/SgmlReader
Leonardo Herrera
Ada beberapa kode yang cukup sederhana dan langsung untuk mengubah HTML menjadi teks biasa di blackbeltcoder.com/Articles/strings/convert-html-to-text .
Jonathan Wood
Ini adalah jawaban yang tepat untuk apa yang saya butuhkan - terima kasih!
Shaul Behr
Ada beberapa saran bagus dari W3C di sini: w3.org/Tools/html2things.html
Kaya
4
Bagaimana pertanyaan dapat ditandai sebagai duplikat dari pertanyaan yang diajukan 6 bulan kemudian? Sepertinya sedikit mundur ...
Stuart Helwig

Jawaban:

28

Jika Anda berbicara tentang penghapusan tag, ini relatif mudah jika Anda tidak perlu mengkhawatirkan hal-hal seperti <script>tag. Jika yang perlu Anda lakukan hanyalah menampilkan teks tanpa tag, Anda dapat melakukannya dengan ekspresi reguler:

<[^>]*>

Jika Anda benar-benar harus khawatir tentang <script>tag dan sejenisnya maka Anda akan memerlukan sesuatu yang sedikit lebih kuat daripada ekspresi reguler karena Anda perlu melacak status, sesuatu yang lebih seperti Tata Bahasa Bebas Konteks (CFG). Meskipun Anda mungkin bisa melakukannya dengan pencocokan 'Kiri ke Kanan' atau tidak serakah.

Jika Anda dapat menggunakan ekspresi reguler, ada banyak halaman web di luar sana dengan info yang bagus:

Jika Anda memerlukan perilaku CFG yang lebih kompleks, saya sarankan untuk menggunakan alat pihak ketiga, sayangnya saya tidak tahu alat yang bagus untuk direkomendasikan.

vfilby.dll
sumber
3
Anda juga perlu khawatir tentang> dalam nilai atribut, komentar, PI / CDATA dalam XML dan berbagai kesalahan format umum dalam HTML lama. Secara umum [X] [HT] ML tidak dapat diurai dengan regexps.
bobince
11
Ini adalah metode yang buruk untuk melakukannya. Cara yang benar adalah dengan mengurai HTML dengan lib dan melintasi dom yang hanya mengeluarkan konten yang masuk daftar putih.
usr
2
@usr: Bagian yang Anda maksud adalah CFG bagian dari jawaban. Regex dapat digunakan untuk pengupasan tag cepat dan kotor, memiliki kelemahan tetapi cepat dan mudah. Untuk penguraian yang lebih rumit, gunakan alat berbasis CFG (dalam bahasa Anda, lib yang menghasilkan DOM). Saya belum melakukan pengujian tetapi saya berani bertaruh bahwa penguraian DOM lebih lambat daripada pengupasan regex, seandainya kinerja perlu dipertimbangkan.
vfilby
1
@vfilby, serangan pertama yang terlintas dalam pikiran adalah menulis "<div id = \" "(c # string syntax). Perhatikan tanda kutip akhir yang hilang dan kurung kurawal tutup yang hilang. Saya kira ini akan membingungkan browser dan ketidakseimbangan struktur tag. Apakah Anda memikirkan serangan ini? Bisakah Anda yakin itu tidak pernah berhasil? Jahat.
usr
1
@vfilby, tidak masalah apakah parsing lib bingung atau tidak. Yang perlu Anda lakukan adalah mengambil DOM darinya (DOM apa pun) dan hanya mengeluarkan komponen yang masuk daftar putih. Ini selalu aman, tidak peduli seperti apa DOM yang diurai. Juga, saya memberi tahu Anda beberapa contoh di mana metode "sederhana" Anda akan gagal menghapus tag.
usr
96

HtmlAgilityPack sumber terbuka dan gratis di salah satu contohnya memiliki metode yang mengonversi dari HTML menjadi teks biasa.

var plainText = HtmlUtilities.ConvertToPlainText(string html);

Beri makan dengan string HTML seperti

<b>hello, <i>world!</i></b>

Dan Anda akan mendapatkan hasil teks biasa seperti:

hello world!
Judah Gabriel Himango
sumber
10
Saya telah menggunakan HtmlAgilityPack sebelumnya tetapi saya tidak dapat melihat referensi apa pun ke ConvertToPlainText. Apakah Anda dapat memberi tahu saya di mana saya dapat menemukannya?
horatio
8
Horatio, itu termasuk dalam salah satu contoh yang disertakan dengan HtmlAgilityPack: htmlagilitypack.codeplex.com/sourcecontrol/changeset/view/…
Judah Gabriel Himango
5
Sebenarnya, tidak ada metode bawaan untuk ini di Agility Pack. Apa yang Anda tautkan adalah contoh yang menggunakan Paket Agility untuk melintasi pohon simpul, menghapus scriptdan memberi styletag dan menulis teks bagian dalam elemen lain ke dalam string keluaran. Saya ragu itu lulus banyak pengujian dengan input dunia nyata.
Lou
3
Bisakah seseorang memberikan kode yang berfungsi, sebagai lawan dari tautan ke sampel yang perlu dipasang kembali agar berfungsi dengan benar?
Eric K
6
Sampel sekarang dapat ditemukan di sini: github.com/ceee/ReadSharp/blob/master/ReadSharp/…
StuartQ
51

Saya tidak dapat menggunakan HtmlAgilityPack, jadi saya menulis solusi terbaik kedua untuk diri saya sendiri

private static string HtmlToPlainText(string html)
{
    const string tagWhiteSpace = @"(>|$)(\W|\n|\r)+<";//matches one or more (white space or line breaks) between '>' and '<'
    const string stripFormatting = @"<[^>]*(>|$)";//match any character between '<' and '>', even when end tag is missing
    const string lineBreak = @"<(br|BR)\s{0,1}\/{0,1}>";//matches: <br>,<br/>,<br />,<BR>,<BR/>,<BR />
    var lineBreakRegex = new Regex(lineBreak, RegexOptions.Multiline);
    var stripFormattingRegex = new Regex(stripFormatting, RegexOptions.Multiline);
    var tagWhiteSpaceRegex = new Regex(tagWhiteSpace, RegexOptions.Multiline);

    var text = html;
    //Decode html specific characters
    text = System.Net.WebUtility.HtmlDecode(text); 
    //Remove tag whitespace/line breaks
    text = tagWhiteSpaceRegex.Replace(text, "><");
    //Replace <br /> with line breaks
    text = lineBreakRegex.Replace(text, Environment.NewLine);
    //Strip formatting
    text = stripFormattingRegex.Replace(text, string.Empty);

    return text;
}
Ben Anderson
sumber
2
& lt; blabla & gt; telah diurai jadi saya memindahkan teks = System.Net.WebUtility.HtmlDecode (teks); ke dasar metode
Luuk
1
Ini hebat, saya juga menambahkan kondensor multispace karena html mungkin telah dihasilkan dari CMS: var spaceRegex = new Regex ("[] {2,}", RegexOptions.None);
Enkode
Kadang di kode html ada baris baru pengkode (baris baru tidak bisa dilihat di komentar, jadi saya tunjukkan dengan [baris baru], seperti: <br> Saya [baris baru] ketinggalan [baris baru] kamu <br >, Jadi seharusnya menunjukkan: "Aku merindukanmu", tapi itu menunjukkan aku [baris baru] merindukan [baris baru] kamu. Ini membuat teks biasa terlihat menyakitkan. Tahukah kamu cara memperbaikinya?
123iamking
@ 123iamking Anda dapat menggunakan ini sebelum teks balasan; : text.Replace ("[baris baru]", "\ n");
Eslam Badawy
Saya menggunakan ini dan menyadari bahwa kadang-kadang meninggalkan '>' di awal string. Solusi lain untuk menerapkan regex <[^>] *> berfungsi dengan baik.
Etienne Charland
20

HTTPUtility.HTMLEncode()dimaksudkan untuk menangani pengkodean tag HTML sebagai string. Ini menangani semua pekerjaan berat untuk Anda. Dari Dokumentasi MSDN :

Jika karakter seperti kosong dan tanda baca diteruskan dalam aliran HTTP, mereka mungkin disalahartikan di pihak penerima. Pengkodean HTML mengubah karakter yang tidak diperbolehkan dalam HTML menjadi entitas-karakter yang setara; Decoding HTML membalikkan pengkodean. Misalnya, bila disematkan dalam blok teks, karakter <dan >, dikodekan sebagai &lt;dan &gt;untuk transmisi HTTP.

HTTPUtility.HTMLEncode()metode, dirinci di sini :

public static void HtmlEncode(
  string s,
  TextWriter output
)

Pemakaian:

String TestString = "This is a <Test String>.";
StringWriter writer = new StringWriter();
Server.HtmlEncode(TestString, writer);
String EncodedString = writer.ToString();
George Stocker
sumber
Jawaban yang sangat bagus George terima kasih, itu juga menyoroti betapa buruknya saya mengajukan pertanyaan pertama kali. Maaf.
Stuart Helwig
html agility pack sudah
usang
10

Untuk menambah jawaban vfilby, Anda bisa melakukan penggantian RegEx dalam kode Anda; tidak diperlukan kelas baru. Dalam kasus pemula lain seperti saya bingung dengan pertanyaan ini.

using System.Text.RegularExpressions;

Kemudian...

private string StripHtml(string source)
{
        string output;

        //get rid of HTML tags
        output = Regex.Replace(source, "<[^>]*>", string.Empty);

        //get rid of multiple blank lines
        output = Regex.Replace(output, @"^\s*$\n", string.Empty, RegexOptions.Multiline);

        return output;
}
WEFX
sumber
19
TIDAK BAIK! Ini dapat diakali untuk memuat skrip dengan menghilangkan tanda kurung sudut penutup. GUYS, jangan pernah melakukan blacklist. Anda tidak dapat membersihkan masukan dengan memasukkan daftar hitam. Ini sangat salah.
usr
7

Proses Tiga Langkah untuk mengubah HTML menjadi Teks Biasa

Pertama Anda Perlu Menginstal Paket Nuget Untuk HtmlAgilityPack Kedua Buat Kelas Ini

public class HtmlToText
{
    public HtmlToText()
    {
    }

    public string Convert(string path)
    {
        HtmlDocument doc = new HtmlDocument();
        doc.Load(path);

        StringWriter sw = new StringWriter();
        ConvertTo(doc.DocumentNode, sw);
        sw.Flush();
        return sw.ToString();
    }

    public string ConvertHtml(string html)
    {
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(html);

        StringWriter sw = new StringWriter();
        ConvertTo(doc.DocumentNode, sw);
        sw.Flush();
        return sw.ToString();
    }

    private void ConvertContentTo(HtmlNode node, TextWriter outText)
    {
        foreach(HtmlNode subnode in node.ChildNodes)
        {
            ConvertTo(subnode, outText);
        }
    }

    public void ConvertTo(HtmlNode node, TextWriter outText)
    {
        string html;
        switch(node.NodeType)
        {
            case HtmlNodeType.Comment:
                // don't output comments
                break;

            case HtmlNodeType.Document:
                ConvertContentTo(node, outText);
                break;

            case HtmlNodeType.Text:
                // script and style must not be output
                string parentName = node.ParentNode.Name;
                if ((parentName == "script") || (parentName == "style"))
                    break;

                // get text
                html = ((HtmlTextNode)node).Text;

                // is it in fact a special closing node output as text?
                if (HtmlNode.IsOverlappedClosingElement(html))
                    break;

                // check the text is meaningful and not a bunch of whitespaces
                if (html.Trim().Length > 0)
                {
                    outText.Write(HtmlEntity.DeEntitize(html));
                }
                break;

            case HtmlNodeType.Element:
                switch(node.Name)
                {
                    case "p":
                        // treat paragraphs as crlf
                        outText.Write("\r\n");
                        break;
                }

                if (node.HasChildNodes)
                {
                    ConvertContentTo(node, outText);
                }
                break;
        }
    }
}

Dengan menggunakan kelas di atas dengan mengacu pada jawaban Judah Himango

Ketiga, Anda perlu membuat Objek kelas di atas dan Gunakan ConvertHtml(HTMLContent)Metode untuk mengubah HTML menjadi Teks Biasa daripadaConvertToPlainText(string html);

HtmlToText htt=new HtmlToText();
var plainText = htt.ConvertHtml(HTMLContent);
Abdulqadir_WDDN
sumber
dapatkah saya melewati konversi tautan di html. saya perlu menyimpan tautan dalam html saat mengonversi ke teks?
coder771
6

Ini memiliki batasan yaitu tidak menciutkan ruang putih sebaris yang panjang, tetapi jelas portabel dan menghormati tata letak seperti penjelajah web.

static string HtmlToPlainText(string html) {
  string buf;
  string block = "address|article|aside|blockquote|canvas|dd|div|dl|dt|" +
    "fieldset|figcaption|figure|footer|form|h\\d|header|hr|li|main|nav|" +
    "noscript|ol|output|p|pre|section|table|tfoot|ul|video";

  string patNestedBlock = $"(\\s*?</?({block})[^>]*?>)+\\s*";
  buf = Regex.Replace(html, patNestedBlock, "\n", RegexOptions.IgnoreCase);

  // Replace br tag to newline.
  buf = Regex.Replace(buf, @"<(br)[^>]*>", "\n", RegexOptions.IgnoreCase);

  // (Optional) remove styles and scripts.
  buf = Regex.Replace(buf, @"<(script|style)[^>]*?>.*?</\1>", "", RegexOptions.Singleline);

  // Remove all tags.
  buf = Regex.Replace(buf, @"<[^>]*(>|$)", "", RegexOptions.Multiline);

  // Replace HTML entities.
  buf = WebUtility.HtmlDecode(buf);
  return buf;
}
jeiea
sumber
4

Tidak ada metode dengan nama 'ConvertToPlainText' di HtmlAgilityPack tetapi Anda dapat mengonversi string html ke string CLEAR dengan:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlString);
var textString = doc.DocumentNode.InnerText;
Regex.Replace(textString , @"<(.|n)*?>", string.Empty).Replace("&nbsp", "");

Itu berhasil untuk saya. TAPI SAYA TIDAK MENEMUKAN METODE DENGAN NAMA 'ConvertToPlainText' IN 'HtmlAgilityPack'.

Amine
sumber
3

Saya pikir cara termudah adalah membuat metode ekstensi 'string' (berdasarkan apa yang disarankan pengguna Richard):

using System;
using System.Text.RegularExpressions;

public static class StringHelpers
{
    public static string StripHTML(this string HTMLText)
        {
            var reg = new Regex("<[^>]+>", RegexOptions.IgnoreCase);
            return reg.Replace(HTMLText, "");
        }
}

Kemudian gunakan saja metode ekstensi ini pada variabel 'string' apa pun di program Anda:

var yourHtmlString = "<div class=\"someclass\"><h2>yourHtmlText</h2></span>";
var yourTextString = yourHtmlString.StripHTML();

Saya menggunakan metode ekstensi ini untuk mengonversi komentar berformat html menjadi teks biasa sehingga akan ditampilkan dengan benar pada laporan kristal, dan berfungsi sempurna!

mikhail-t
sumber
3

Cara paling sederhana yang saya temukan:

HtmlFilter.ConvertToPlainText(html);

Kelas HtmlFilter terletak di Microsoft.TeamFoundation.WorkItemTracking.Controls.dll

Dll dapat ditemukan di folder seperti ini:% ProgramFiles% \ Common Files \ microsoft shared \ Team Foundation Server \ 14.0 \

Di VS 2015, dll juga memerlukan referensi ke Microsoft.TeamFoundation.WorkItemTracking.Common.dll, yang terletak di folder yang sama.

Roman O
sumber
apakah itu menangani tag skrip dan apakah itu memformat sebagai miring tebal dll?
Samra
Memperkenalkan ketergantungan yayasan tim untuk mengonversi html ke teks biasa, sangat dipertanyakan ...
ViRuSTriNiTy
2

Jika Anda memiliki data yang memiliki tag HTML dan Anda ingin menampilkannya agar seseorang dapat MELIHAT tag tersebut, gunakan HttpServerUtility :: HtmlEncode.

Jika Anda memiliki data yang memiliki tag HTML di dalamnya dan Anda ingin pengguna melihat tag tersebut dirender, tampilkan teks apa adanya. Jika teks mewakili seluruh halaman web, gunakan IFRAME untuk itu.

Jika Anda memiliki data yang memiliki tag HTML dan Anda ingin menghapus tag dan hanya menampilkan teks yang tidak diformat, gunakan ekspresi reguler.

Corey Trager
sumber
di php ada fungsi yang disebut striptags () mungkin Anda memiliki sesuatu yang serupa
markus
"gunakan ekspresi reguler" TIDAK! Ini akan masuk daftar hitam. Anda hanya dapat melakukan whitelist dengan aman. Misalnya, apakah Anda ingat bahwa gaya attibute dapat berisi "background: url ('javascript: ...');"? tentu saja tidak, saya juga tidak. Itulah mengapa daftar hitam tidak berfungsi.
usr
2

Saya telah menghadapi masalah serupa dan menemukan solusi terbaik. Kode di bawah ini berfungsi sempurna untuk saya.

  private string ConvertHtml_Totext(string source)
    {
     try
      {
      string result;

    // Remove HTML Development formatting
    // Replace line breaks with space
    // because browsers inserts space
    result = source.Replace("\r", " ");
    // Replace line breaks with space
    // because browsers inserts space
    result = result.Replace("\n", " ");
    // Remove step-formatting
    result = result.Replace("\t", string.Empty);
    // Remove repeating spaces because browsers ignore them
    result = System.Text.RegularExpressions.Regex.Replace(result,
                                                          @"( )+", " ");

    // Remove the header (prepare first by clearing attributes)
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"<( )*head([^>])*>","<head>",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"(<( )*(/)( )*head( )*>)","</head>",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             "(<head>).*(</head>)",string.Empty,
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // remove all scripts (prepare first by clearing attributes)
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"<( )*script([^>])*>","<script>",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"(<( )*(/)( )*script( )*>)","</script>",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    //result = System.Text.RegularExpressions.Regex.Replace(result,
    //         @"(<script>)([^(<script>\.</script>)])*(</script>)",
    //         string.Empty,
    //         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"(<script>).*(</script>)",string.Empty,
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // remove all styles (prepare first by clearing attributes)
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"<( )*style([^>])*>","<style>",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"(<( )*(/)( )*style( )*>)","</style>",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             "(<style>).*(</style>)",string.Empty,
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // insert tabs in spaces of <td> tags
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"<( )*td([^>])*>","\t",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // insert line breaks in places of <BR> and <LI> tags
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"<( )*br( )*>","\r",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"<( )*li( )*>","\r",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // insert line paragraphs (double line breaks) in place
    // if <P>, <DIV> and <TR> tags
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"<( )*div([^>])*>","\r\r",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"<( )*tr([^>])*>","\r\r",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"<( )*p([^>])*>","\r\r",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // Remove remaining tags like <a>, links, images,
    // comments etc - anything that's enclosed inside < >
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"<[^>]*>",string.Empty,
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // replace special characters:
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @" "," ",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"&bull;"," * ",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"&lsaquo;","<",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"&rsaquo;",">",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"&trade;","(tm)",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"&frasl;","/",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"&lt;","<",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"&gt;",">",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"&copy;","(c)",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"&reg;","(r)",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    // Remove all others. More can be added, see
    // http://hotwired.lycos.com/webmonkey/reference/special_characters/
    result = System.Text.RegularExpressions.Regex.Replace(result,
             @"&(.{2,6});", string.Empty,
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // for testing
    //System.Text.RegularExpressions.Regex.Replace(result,
    //       this.txtRegex.Text,string.Empty,
    //       System.Text.RegularExpressions.RegexOptions.IgnoreCase);

    // make line breaking consistent
    result = result.Replace("\n", "\r");

    // Remove extra line breaks and tabs:
    // replace over 2 breaks with 2 and over 4 tabs with 4.
    // Prepare first to remove any whitespaces in between
    // the escaped characters and remove redundant tabs in between line breaks
    result = System.Text.RegularExpressions.Regex.Replace(result,
             "(\r)( )+(\r)","\r\r",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             "(\t)( )+(\t)","\t\t",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             "(\t)( )+(\r)","\t\r",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    result = System.Text.RegularExpressions.Regex.Replace(result,
             "(\r)( )+(\t)","\r\t",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    // Remove redundant tabs
    result = System.Text.RegularExpressions.Regex.Replace(result,
             "(\r)(\t)+(\r)","\r\r",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    // Remove multiple tabs following a line break with just one tab
    result = System.Text.RegularExpressions.Regex.Replace(result,
             "(\r)(\t)+","\r\t",
             System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    // Initial replacement target string for line breaks
    string breaks = "\r\r\r";
    // Initial replacement target string for tabs
    string tabs = "\t\t\t\t\t";
    for (int index=0; index<result.Length; index++)
    {
        result = result.Replace(breaks, "\r\r");
        result = result.Replace(tabs, "\t\t\t\t");
        breaks = breaks + "\r";
        tabs = tabs + "\t";
    }

    // That's it.
    return result;
}
catch
{
    MessageBox.Show("Error");
    return source;
}

}

Karakter melarikan diri seperti \ n dan \ r harus dihapus terlebih dahulu karena menyebabkan ekspresi reguler berhenti berfungsi seperti yang diharapkan.

Selain itu, untuk membuat string hasil ditampilkan dengan benar di kotak teks, seseorang mungkin perlu membaginya dan menyetel properti Garis kotak teks alih-alih menetapkan ke properti Teks.

this.txtResult.Lines = StripHTML (this.txtSource.Text) .Split ("\ r" .ToCharArray ());

Sumber: https://www.codeproject.com/Articles/11902/Convert-HTML-to-Plain-Text-2

LakshmiSarada
sumber
0

Tergantung pada apa yang Anda maksud dengan "html". Kasus yang paling kompleks adalah halaman web lengkap. Itu juga yang paling mudah ditangani, karena Anda dapat menggunakan browser web mode teks. Lihat artikel Wikipedia yang mencantumkan browser web, termasuk browser mode teks. Lynx mungkin yang paling terkenal, tetapi salah satu dari yang lain mungkin lebih baik untuk kebutuhan Anda.

mpez0
sumber
saat dia berkata "Saya memiliki potongan Html yang disimpan dalam sebuah tabel."
M pada
0

Inilah solusi saya:

public string StripHTML(string html)
{
    var regex = new Regex("<[^>]+>", RegexOptions.IgnoreCase);
    return System.Web.HttpUtility.HtmlDecode((regex.Replace(html, "")));
}

Contoh:

StripHTML("<p class='test' style='color:red;'>Here is my solution:</p>");
// output -> Here is my solution:
Mehdi Dehghani
sumber
0

Saya memiliki pertanyaan yang sama, hanya html saya yang memiliki tata letak sederhana yang telah diketahui sebelumnya, seperti:

<DIV><P>abc</P><P>def</P></DIV>

Jadi saya akhirnya menggunakan kode sederhana seperti itu:

string.Join (Environment.NewLine, XDocument.Parse (html).Root.Elements ().Select (el => el.Value))

Output mana:

abc
def
Karlas
sumber
0

Tidak menulis tetapi menggunakan:

using HtmlAgilityPack;
using System;
using System.IO;
using System.Text.RegularExpressions;

namespace foo {
  //small but important modification to class https://github.com/zzzprojects/html-agility-pack/blob/master/src/Samples/Html2Txt/HtmlConvert.cs
  public static class HtmlToText {

    public static string Convert(string path) {
      HtmlDocument doc = new HtmlDocument();
      doc.Load(path);
      return ConvertDoc(doc);
    }

    public static string ConvertHtml(string html) {
      HtmlDocument doc = new HtmlDocument();
      doc.LoadHtml(html);
      return ConvertDoc(doc);
    }

    public static string ConvertDoc(HtmlDocument doc) {
      using (StringWriter sw = new StringWriter()) {
        ConvertTo(doc.DocumentNode, sw);
        sw.Flush();
        return sw.ToString();
      }
    }

    internal static void ConvertContentTo(HtmlNode node, TextWriter outText, PreceedingDomTextInfo textInfo) {
      foreach (HtmlNode subnode in node.ChildNodes) {
        ConvertTo(subnode, outText, textInfo);
      }
    }
    public static void ConvertTo(HtmlNode node, TextWriter outText) {
      ConvertTo(node, outText, new PreceedingDomTextInfo(false));
    }
    internal static void ConvertTo(HtmlNode node, TextWriter outText, PreceedingDomTextInfo textInfo) {
      string html;
      switch (node.NodeType) {
        case HtmlNodeType.Comment:
          // don't output comments
          break;
        case HtmlNodeType.Document:
          ConvertContentTo(node, outText, textInfo);
          break;
        case HtmlNodeType.Text:
          // script and style must not be output
          string parentName = node.ParentNode.Name;
          if ((parentName == "script") || (parentName == "style")) {
            break;
          }
          // get text
          html = ((HtmlTextNode)node).Text;
          // is it in fact a special closing node output as text?
          if (HtmlNode.IsOverlappedClosingElement(html)) {
            break;
          }
          // check the text is meaningful and not a bunch of whitespaces
          if (html.Length == 0) {
            break;
          }
          if (!textInfo.WritePrecedingWhiteSpace || textInfo.LastCharWasSpace) {
            html = html.TrimStart();
            if (html.Length == 0) { break; }
            textInfo.IsFirstTextOfDocWritten.Value = textInfo.WritePrecedingWhiteSpace = true;
          }
          outText.Write(HtmlEntity.DeEntitize(Regex.Replace(html.TrimEnd(), @"\s{2,}", " ")));
          if (textInfo.LastCharWasSpace = char.IsWhiteSpace(html[html.Length - 1])) {
            outText.Write(' ');
          }
          break;
        case HtmlNodeType.Element:
          string endElementString = null;
          bool isInline;
          bool skip = false;
          int listIndex = 0;
          switch (node.Name) {
            case "nav":
              skip = true;
              isInline = false;
              break;
            case "body":
            case "section":
            case "article":
            case "aside":
            case "h1":
            case "h2":
            case "header":
            case "footer":
            case "address":
            case "main":
            case "div":
            case "p": // stylistic - adjust as you tend to use
              if (textInfo.IsFirstTextOfDocWritten) {
                outText.Write("\r\n");
              }
              endElementString = "\r\n";
              isInline = false;
              break;
            case "br":
              outText.Write("\r\n");
              skip = true;
              textInfo.WritePrecedingWhiteSpace = false;
              isInline = true;
              break;
            case "a":
              if (node.Attributes.Contains("href")) {
                string href = node.Attributes["href"].Value.Trim();
                if (node.InnerText.IndexOf(href, StringComparison.InvariantCultureIgnoreCase) == -1) {
                  endElementString = "<" + href + ">";
                }
              }
              isInline = true;
              break;
            case "li":
              if (textInfo.ListIndex > 0) {
                outText.Write("\r\n{0}.\t", textInfo.ListIndex++);
              } else {
                outText.Write("\r\n*\t"); //using '*' as bullet char, with tab after, but whatever you want eg "\t->", if utf-8 0x2022
              }
              isInline = false;
              break;
            case "ol":
              listIndex = 1;
              goto case "ul";
            case "ul": //not handling nested lists any differently at this stage - that is getting close to rendering problems
              endElementString = "\r\n";
              isInline = false;
              break;
            case "img": //inline-block in reality
              if (node.Attributes.Contains("alt")) {
                outText.Write('[' + node.Attributes["alt"].Value);
                endElementString = "]";
              }
              if (node.Attributes.Contains("src")) {
                outText.Write('<' + node.Attributes["src"].Value + '>');
              }
              isInline = true;
              break;
            default:
              isInline = true;
              break;
          }
          if (!skip && node.HasChildNodes) {
            ConvertContentTo(node, outText, isInline ? textInfo : new PreceedingDomTextInfo(textInfo.IsFirstTextOfDocWritten) { ListIndex = listIndex });
          }
          if (endElementString != null) {
            outText.Write(endElementString);
          }
          break;
      }
    }
  }
  internal class PreceedingDomTextInfo {
    public PreceedingDomTextInfo(BoolWrapper isFirstTextOfDocWritten) {
      IsFirstTextOfDocWritten = isFirstTextOfDocWritten;
    }
    public bool WritePrecedingWhiteSpace { get; set; }
    public bool LastCharWasSpace { get; set; }
    public readonly BoolWrapper IsFirstTextOfDocWritten;
    public int ListIndex { get; set; }
  }
  internal class BoolWrapper {
    public BoolWrapper() { }
    public bool Value { get; set; }
    public static implicit operator bool(BoolWrapper boolWrapper) {
      return boolWrapper.Value;
    }
    public static implicit operator BoolWrapper(bool boolWrapper) {
      return new BoolWrapper { Value = boolWrapper };
    }
  }
}
sobelito
sumber
0

Saya pikir jawabannya sederhana:

public string RemoveHTMLTags(string HTMLCode)
{
    string str=System.Text.RegularExpressions.Regex.Replace(HTMLCode, "<[^>]*>", "");
    return str;
}
pengguna3077654
sumber
0

Bagi siapa saja yang mencari solusi tepat untuk pertanyaan OP untuk singkatan tekstual dari dokumen html tertentu, tanpa baris baru dan tag HTML, temukan solusi di bawah ini.

Seperti setiap solusi yang diusulkan, ada beberapa asumsi dengan kode di bawah ini:

  • script atau style tag tidak boleh mengandung script dan style tag sebagai bagian dari script
  • hanya elemen sebaris utama yang akan dibuat sebaris tanpa spasi, yaitu he<span>ll</span>oharus dikeluarkan hello. Daftar tag sebaris: https://www.w3schools.com/htmL/html_blocks.asp

Mempertimbangkan hal di atas, ekstensi string berikut dengan ekspresi reguler terkompilasi akan menghasilkan teks biasa yang diharapkan terkait dengan karakter yang diloloskan html dan null pada masukan nol.

public static class StringExtensions
{
    public static string ConvertToPlain(this string html)
    {
        if (html == null)
        {
            return html;
        }

        html = scriptRegex.Replace(html, string.Empty);
        html = inlineTagRegex.Replace(html, string.Empty);
        html = tagRegex.Replace(html, " ");
        html = HttpUtility.HtmlDecode(html);
        html = multiWhitespaceRegex.Replace(html, " ");

        return html.Trim();
    }

    private static readonly Regex inlineTagRegex = new Regex("<\\/?(a|span|sub|sup|b|i|strong|small|big|em|label|q)[^>]*>", RegexOptions.Compiled | RegexOptions.Singleline);
    private static readonly Regex scriptRegex = new Regex("<(script|style)[^>]*?>.*?</\\1>", RegexOptions.Compiled | RegexOptions.Singleline);
    private static readonly Regex tagRegex = new Regex("<[^>]+>", RegexOptions.Compiled | RegexOptions.Singleline);
    private static readonly Regex multiWhitespaceRegex = new Regex("\\s+", RegexOptions.Compiled | RegexOptions.Singleline);
}
terlalu
sumber
-4

publik string statis StripTags2 (string html) {kembali html.Replace ("<", "<"). Replace (">", ">"); }

Dengan ini, Anda melepaskan semua "<" dan ">" dalam sebuah string. Apa ini yang kau inginkan?

José Leal
sumber
...ah. Sekarang jawabannya (bersama dengan interpretasi dari pertanyaan yang ambigu) telah sepenuhnya berubah, saya akan memilih nits pada kurangnya & amp; encoding sebagai gantinya. ;-)
bobince
2
Saya rasa bukanlah ide yang baik untuk menemukan kembali roda - terutama ketika roda Anda berbentuk persegi. Anda harus menggunakan HTMLEncode sebagai gantinya.
Kramii