কীভাবে আপনি এইচটিএমএলকে সরল পাঠ্যে রূপান্তর করবেন?


104

আমার এইচটিএমএলের স্নিপেটগুলি একটি টেবিলের মধ্যে সঞ্চিত আছে। পুরো পৃষ্ঠাগুলি নয়, কোনও ট্যাগ বা মত নয়, কেবলমাত্র প্রাথমিক বিন্যাস।

আমি এইচটিএমএলকে প্রদত্ত পৃষ্ঠায় কেবল পাঠ্য হিসাবে বিন্যাসকরণ হিসাবে প্রদর্শন করতে সক্ষম হতে চাই (আসলে প্রথম 30 - 50 অক্ষর তবে এটি সহজ বিট)।

আমি কীভাবে "এইচটিএমএল" এর মধ্যে "পাঠ্য "টিকে স্ট্রিংয়ে সরল পাঠ্য হিসাবে রাখতে পারি?

সুতরাং কোড এই টুকরা।

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

হয়ে:

ওহে বিশ্ব. কেউ কি বাইরে আছে?


আপনি SgmlReader ব্যবহার করতে পারেন। কোড.msdn.microsoft.com/SgmlReader
লিওনার্দো হেরেরা

ব্ল্যাকবেলটকোডার / আর্টিকেলস /স্ট্রিংস / কনভার্ট-html- to-text এ এইচটিএমএলকে সাধারণ পাঠ্যে রূপান্তর করার জন্য বেশ সহজ এবং সরল-ফরোয়ার্ড কোড রয়েছে ।
জোনাথন উড

আমার যা প্রয়োজন তার জন্য এটি সঠিক উত্তর ছিল - ধন্যবাদ!
শৈল বেহর


4
যে প্রশ্নটি 6 মাস পরে জিজ্ঞাসা করা হয়েছিল তার প্রশ্নের সদৃশ হিসাবে চিহ্নিত করা যায়? কিছুটা পিছিয়ে গেছে বলে মনে হচ্ছে ...
স্টুয়ার্ট হেলভিগ

উত্তর:


27

আপনি যদি ট্যাগ স্ট্রিপিংয়ের কথা বলছেন তবে <script>ট্যাগগুলির মতো জিনিসগুলির জন্য আপনাকে যদি চিন্তা করতে না হয় তবে তুলনামূলকভাবে সরাসরি forward আপনার যদি যা করতে হয় তা হ'ল ট্যাগ ব্যতীত পাঠ্য প্রদর্শন করতে হলে আপনি নিয়মিত প্রকাশের মাধ্যমে তা সম্পাদন করতে পারেন:

<[^>]*>

আপনি যদি <script>ট্যাগ এবং এর মতো বিষয়ে চিন্তা করতে চান তবে আপনার নিয়মিত প্রকাশের জন্য আরও কিছুটা শক্তিশালী কিছু প্রয়োজন কারণ আপনাকে রাষ্ট্রকে ট্র্যাক করতে হবে, যা আরও একটি প্রসঙ্গে নিখরচায় গ্রামার (সিএফজি) এর মতো। ভেবেছিলেন আপনি এটি 'বাম থেকে ডানে' বা অ-লোভী মিলের সাথে সম্পাদন করতে সক্ষম হতে পারেন।

আপনি যদি নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন তবে সেখানে ভাল তথ্যের সাথে অনেকগুলি ওয়েব পৃষ্ঠা রয়েছে:

আপনার যদি কোনও সিএফজির আরও জটিল আচরণের প্রয়োজন হয় তবে আমি তৃতীয় পক্ষের সরঞ্জামটি ব্যবহার করার পরামর্শ দেব, দুর্ভাগ্যক্রমে আমি কোনও ভাল প্রস্তাব দেওয়ার জন্য জানি না।


4
এক্সএমএলে বৈশিষ্ট্য মান, মন্তব্য, পিআই / সিডিটিএ এবং লিগ্যাসি এইচটিএমএলে বিভিন্ন সাধারণ ত্রুটিযুক্ত বিষয়ে আপনাকে> সম্পর্কেও উদ্বিগ্ন হতে হবে। সাধারণভাবে [এক্স] [এইচটি] এমএল রিজেক্সপ্সের সাথে পার্সিংয়ের পক্ষে উপযুক্ত নয়।
বোবিনস

13
এটি করা একটি ভয়ানক পদ্ধতি। সঠিক উপায় হ'ল এইচটিএমএলকে একটি লিবের সাহায্যে পার্স করা এবং ডোম আউটপুটিংকে কেবল শ্বেত তালিকাভুক্ত সামগ্রীকে অতিক্রম করা।
usr

4
@ আরআর: আপনি যে অংশটি উল্লেখ করছেন সেটি হ'ল উত্তরের সিএফজি অংশ। রেগেক্স দ্রুত এবং নোংরা ট্যাগ স্ট্রিপিংয়ের জন্য ব্যবহার করা যেতে পারে, এটির দুর্বলতা রয়েছে তবে এটি দ্রুত এবং এটি সহজ। আরও জটিল বিশ্লেষণের জন্য একটি সিএফজি ভিত্তিক সরঞ্জাম ব্যবহার করুন (আপনার পার্লেন্সে একটি ডিওএম উত্পন্ন করে এমন একটি lib)। আমি পরীক্ষাগুলি সম্পাদন করি নি তবে আমি বাজি রেখেছিলাম যে ডম পার্সিং রেগেক্স স্ট্রিপিংয়ের চেয়ে ধীর, যদি পারফরম্যান্স বিবেচনা করা দরকার।
vfilby

4
@vfilby, প্রথম আক্রমণটি যা মনে আসে তা হ'ল "<div id = \" "(সি # স্ট্রিং সিনট্যাক্স) লিখুন the আপনি এই আক্রমণের মনে হয় তুমি হতে পারে নিশ্চিত করুন যে এটি কখনোই কাজ করে কদর্য?।
usr ডিরেক্টরির

4
@ ভিলফিলি, পার্সিং লিব বিভ্রান্ত হয়েছে কিনা তা কিছু যায় আসে না। আপনাকে যা করতে হবে তা হ'ল এটি থেকে ডিওএম নেওয়া (যে কোনও ডিওএম মোটেও) এবং কেবল শ্বেত তালিকাভুক্ত উপাদানগুলি আউটপুট। এটি সর্বদা নিরাপদ, পার্সড ডিওএম দেখতে কেমন তা বিচার্য নয়। এছাড়াও, আমি আপনাকে একাধিক উদাহরণ বলেছি যেখানে আপনার "সরল" পদ্ধতিটি ট্যাগগুলি সরাতে ব্যর্থ হবে।
usr

99

ফ্রি এবং ওপেন সোর্স HtmlAgilityPack হয়েছে তার নমুনা এক একটি পদ্ধতি যে প্লেন টেক্সটে HTML থেকে পরিবর্তন করে।

var plainText = HtmlUtilities.ConvertToPlainText(string html);

এটি একটি এইচটিএমএল স্ট্রিং মত খাওয়ান

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

এবং আপনি যেমন একটি সরল পাঠ্য ফলাফল পাবেন:

hello world!

10
আমি এর আগে এইচটিএমএলএগিলিটিপ্যাক ব্যবহার করেছি তবে কনভার্টটোপ্লেইন টেক্সটের কোনও রেফারেন্স দেখতে পাচ্ছি না। আমি কোথায় এটি খুঁজে পেতে পারেন আপনি আমাকে বলতে সক্ষম?
হোরাটিও

8
হোরেটিও, এটি এইচটিএমএলএগিলিটিপ্যাকের সাথে যে নমুনাগুলি আসে তার মধ্যে একটি অন্তর্ভুক্ত: htmlagilitypack.codeplex.com/sourcecontrol/ بدل
যিহূদা গ্যাব্রিয়েল হিমাঙ্গো

5
আসলে, এগ্রিলিটি প্যাকের জন্য এটির জন্য বিল্ট ইন পদ্ধতি নেই method আপনি যাটির সাথে লিঙ্ক করেছেন এটি হ'ল উদাহরণস্বরূপ যা নোড ট্রিকে অতিক্রম করতে, অপসারণ করতে scriptএবং styleট্যাগ করতে এবং আউটপুট স্ট্রিংয়ে অন্যান্য উপাদানগুলির অভ্যন্তরীণ পাঠ্য লেখার জন্য এগ্রিলিটি প্যাক ব্যবহার করে । আমি সন্দেহ করি এটি বাস্তব বিশ্বের ইনপুটগুলির সাথে অনেক পরীক্ষায় উত্তীর্ণ হয়েছে।
লু

4
কেউ দয়া করে সেই কোডটি সরবরাহ করতে পারেন, যে নমুনাগুলির লিঙ্কগুলির বিপরীতে সঠিকভাবে কাজ করার জন্য পুনঃনির্মাণ করা দরকার?
এরিক কে

6
নমুনাটি এখন এখানে পাওয়া যাবে: github.com/ceee/Redadharp/blob/master/Redadharp/…
স্টুয়ার্টকিউ

54

আমি এইচটিএমএলএগিলিটিপ্যাকটি ব্যবহার করতে পারিনি, তাই আমি নিজের জন্য দ্বিতীয় সেরা সমাধানটি লিখেছি

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;
}

4
& lt; ব্লেবলা & জিটি; পার্স আউট করা হয়েছে তাই আমি টেক্সটটি সরিয়ে নিয়েছি = System.Net.WebUटिल.HtmlDecode (পাঠ্য); পদ্ধতির নীচে
Luuk

4
এটি দুর্দান্ত ছিল, আমি একটি মাল্টিস্পেস কনডেনসার যুক্ত করেছিলাম কারণ এইচটিএমএলটি কোনও সিএমএস থেকে উত্পন্ন হতে পারে: var স্পেসরেজেক্স = নতুন রেইজেক্স ("[] {2,}", রিজেক্সঅপশনস।নোন);
এনকোড

কোনও এক সময়, এইচটিএমএল কোডে কোডারের নতুন লাইন থাকে (নতুন লাইনটি মন্তব্যে দেখা যায় না, তাই আমি এটিকে [নতুন লাইন] দিয়ে দেখি, যেমন: <br> আমি [নতুন লাইন] মিস করছি [নতুন লাইন] আপনি <BR >, সুতরাং এটি দেখানোর মতো মনে হচ্ছে: "আমি আপনাকে মিস করছি", তবে এটি আপনাকে [নতুন লাইন] মিস [নতুন লাইন] দেখায় This এটি সাধারণ পাঠ্যকে বেদনাদায়ক দেখায়। আপনি কীভাবে ঠিক করতে জানেন?
123iamking

@ 123iamking আপনি রিটার্ন পাঠ্যের আগে এটি ব্যবহার করতে পারেন; : পাঠ্য.পরিবর্তন ("[নতুন লাইন]", "\ n");
এসলাম বাদোয়া

আমি এটি ব্যবহার করছিলাম এবং বুঝতে পেরেছিলাম যে কখনও কখনও স্ট্রিংগুলির শুরুতে এটি '>' ছেড়ে যায়। রেজেক্স <[^>] *> প্রয়োগের অন্য সমাধানটি ঠিকঠাক কাজ করে।
এটিয়েন চারল্যান্ড

19

HTTPUtility.HTMLEncode()মানে এনকোডিং এইচটিএমএল ট্যাগগুলি স্ট্রিং হিসাবে পরিচালনা করা। এটি আপনার জন্য সমস্ত ভারী উত্তোলনের যত্ন নেয়। থেকে MSDN ডকুমেন্টেশন :

ফাঁকা এবং বিরামচিহ্নের মতো অক্ষরগুলি যদি কোনও এইচটিটিপি প্রবাহে পাস করা হয় তবে এগুলি প্রাপ্তির শেষে ভুল ব্যাখ্যা করা যেতে পারে। এইচটিএমএল এনকোডিং এমন অক্ষরকে রূপান্তর করে যা এইচটিএমএলকে অক্ষর-সত্তা সমতুল্যে রূপান্তরিত হয় না; এইচটিএমএল ডিকোডিং এনকোডিংকে বিপরীত করে। উদাহরণস্বরূপ, পাঠ্যের একটি ব্লকে এম্বেড করার সময়, অক্ষর <এবং >, এইচটিটিপি সংক্রমণ হিসাবে &lt;এবং এনকোড করা হয় &gt;

HTTPUtility.HTMLEncode()পদ্ধতি, এখানে বিস্তারিত :

public static void HtmlEncode(
  string s,
  TextWriter output
)

ব্যবহার:

String TestString = "This is a <Test String>.";
StringWriter writer = new StringWriter();
Server.HtmlEncode(TestString, writer);
String EncodedString = writer.ToString();

সত্যিই একটি ভাল উত্তর জর্জ ধন্যবাদ, এটি প্রথমবারের মতো প্রশ্নটি খুব খারাপভাবে জিজ্ঞাসা করেছিল তাও হাইলাইট করেছিল। দুঃখিত
স্টুয়ার্ট হেলভিগ

এইচটিএমএল তত্পরতা প্যাকটি
পুরনো হয়ে গেছে

9

ভিফিলবির উত্তরে যুক্ত করতে, আপনি কেবল নিজের কোডের মধ্যে একটি রেজিএক্স প্রতিস্থাপন করতে পারেন; কোন নতুন ক্লাস প্রয়োজন। যদি আমার মতো অন্যান্য নবজাতকরা এই প্রশ্নটিতে পদস্খলন করে।

using System.Text.RegularExpressions;

তারপরে ...

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;
}

19
ভাল না! ক্লোজিং এঙ্গেল বন্ধনী বাদ দিয়ে স্ক্রিপ্ট ধারণ করতে এটি ট্রিক করা যেতে পারে। ভাল, কখনই ব্ল্যাকলিস্টিং করবেন না। আপনি কালো তালিকাভুক্ত করে ইনপুট স্যানিটাইজ করতে পারবেন না । এটি খুব ভূল.
usr

7

এইচটিএমএলকে সাধারণ পাঠ্যে রূপান্তর করার জন্য তিন ধাপ প্রক্রিয়া

প্রথমে আপনাকে এইচটিএমএলএজিলিটিপ্যাকের জন্য নুগেট প্যাকেজ ইনস্টল করতে হবে দ্বিতীয় এই ক্লাসটি তৈরি করুন

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;
        }
    }
}

যিহূদা হিমনগোর উত্তরের রেফারেন্স সহ উপরের শ্রেণীটি ব্যবহার করে

তৃতীয় আপনার উপরের শ্রেণীর অবজেক্ট তৈরি করতে হবে এবং ConvertHtml(HTMLContent)এইচটিএমএলকে পরিবর্তে পরিবর্তিত করার জন্য পদ্ধতিটি ব্যবহার করুনConvertToPlainText(string html);

HtmlToText htt=new HtmlToText();
var plainText = htt.ConvertHtml(HTMLContent);

আমি কি এইচটিএমএলে রূপান্তরকারী লিঙ্কগুলি এড়িয়ে যেতে পারি? পাঠ্যে রূপান্তর করার সময় আমার এইচটিএমএল লিঙ্কগুলি রাখা দরকার?
কোডার 771

5

এটির সীমাবদ্ধতা রয়েছে যে দীর্ঘ ইনলাইন হোয়াইটস্পেসকে ভেঙে ফেলছে না তবে এটি অবশ্যই বহনযোগ্য এবং ওয়েব ব্রাউজারের মতো লেআউটকে সম্মান করে।

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;
}

3

আমি মনে করি সহজ উপায় হ'ল 'স্ট্রিং' এক্সটেনশন পদ্ধতি তৈরি করা (ব্যবহারকারী রিচার্ডের পরামর্শ অনুসারে):

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, "");
        }
}

তারপরে আপনার প্রোগ্রামে যে কোনও 'স্ট্রিং' ভেরিয়েবলের জন্য কেবল এই এক্সটেনশন পদ্ধতিটি ব্যবহার করুন:

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

আমি এই এক্সটেনশন পদ্ধতিটি এইচটিএমএল ফর্ম্যাট করা মন্তব্যগুলিকে সরল পাঠ্যে রূপান্তর করতে ব্যবহার করি যাতে এটি কোনও স্ফটিক প্রতিবেদনে সঠিকভাবে প্রদর্শিত হবে এবং এটি নিখুঁতভাবে কাজ করে!


3

এইচটিএমএলিলিটিপ্যাকটিতে 'কনভার্টটোপ্লেইন টেক্সট' নামের কোনও পদ্ধতি নেই তবে আপনি এইচটিএমএল স্ট্রিংকে ক্লিয়ার স্ট্রিংয়ে রূপান্তর করতে পারেন:

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

আমার জন্য কাজ করে। তবে আমি 'এইচটিএমএলিলিটিপ্যাক'-এ' কনভার্টটোপ্লেইন টেক্সট 'নামের সাথে একটি উপায় খুঁজে পাচ্ছি না।


2

যদি আপনার এমন ডেটা থাকে যাতে এইচটিএমএল ট্যাগ রয়েছে এবং আপনি এটি প্রদর্শন করতে চান যাতে কোনও ব্যক্তি ট্যাগগুলি দেখতে পারে, এইচটিপিএস সার্ভার ইউটিলিটি :: এইচটিএমএলএনকোড ব্যবহার করুন।

আপনার যদি এমন ডেটা থাকে যাতে এতে HTML টি ট্যাগ থাকে এবং আপনি ব্যবহারকারীরা ট্যাগ হওয়া ট্যাগগুলি দেখতে চান, তবে পাঠ্যটি যেমন হয় তেমন প্রদর্শন করুন। যদি পাঠ্যটি একটি সম্পূর্ণ ওয়েব পৃষ্ঠার প্রতিনিধিত্ব করে তবে এর জন্য একটি আইফ্রেম ব্যবহার করুন।

আপনার যদি এইচটিএমএল ট্যাগ রয়েছে এমন ডেটা থাকে এবং আপনি ট্যাগগুলি বের করে দিতে চান এবং কেবল বিনা বিন্যাসে পাঠ্য প্রদর্শন করতে চান তবে একটি নিয়মিত অভিব্যক্তি ব্যবহার করুন।


পিএইচপি একটি ফাংশন বলা striptags আছে () হতে পারে আপনি অনুরূপ কিছু আছে
মার্কুস

"একটি নিয়মিত অভিব্যক্তি ব্যবহার করুন" না! এটি কালো তালিকাভুক্ত হবে। আপনি কেবল হোয়াইটলিস্টিং থেকে নিরাপদ থাকতে পারবেন। উদাহরণস্বরূপ আপনি কাকে স্মরণ করেছেন যে স্টাইল অ্যাটটিবেটে "ব্যাকগ্রাউন্ড: ইউআরএল ('জাভাস্ক্রিপ্ট: ...');" থাকতে পারে? অবশ্যই না, আমারও নেই। ব্ল্যাকলিস্টিং কেন কাজ করে না তা জানায়।
usr ডিরেক্টরির

2

সবচেয়ে সহজ উপায় আমি খুঁজে পেয়েছি:

HtmlFilter.ConvertToPlainText(html);

এইচটিএমএল ফিল্টার ক্লাসটি মাইক্রোসফ্টে অবস্থিত e টিমফাউন্ডেশন ation ওয়ার্ক আইটেম ট্র্যাকিং C কন্ট্রোল.ডিল

Dll এর মতো ফোল্ডারে পাওয়া যাবে:% প্রোগ্রাম ফাইল%% কমন ফাইলস \ মাইক্রোসফ্ট শেয়ার করেছেন \ টিম ফাউন্ডেশন সার্ভার

ভিএস ২০১৫-তে, ডেলটির একই ফোল্ডারে অবস্থিত মাইক্রোসফ্ট.টিমফাউন্ডেশন.ওয়ার্কআইটিটিট্র্যাকিং.কমন.ডিলেরও রেফারেন্স দরকার।


এটি কি স্ক্রিপ্ট ট্যাগগুলির যত্ন নেয় এবং এটি গা bold় তির্যক ইত্যাদি হিসাবে ফর্ম্যাট করে?
সামরা

4
এইচটিএমএলকে সরল পাঠ্যে রূপান্তর করার জন্য একটি টিম ফাউন্ডেশন নির্ভরতা উপস্থাপন করা, খুব প্রশ্নবিদ্ধ ...
ভাইরুস্ট্রিনিটি

2

আমি অনুরূপ সমস্যার মুখোমুখি হয়েছি এবং এর সেরা সমাধান খুঁজে পেয়েছি। নীচের কোডটি আমার জন্য নিখুঁত কাজ করে।

  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;
}

}

Escape n এবং \ r এর মতো পালানোর অক্ষরগুলিকে প্রথমে সরিয়ে ফেলতে হয়েছিল কারণ তারা পুনর্বিবেচনাগুলি প্রত্যাশা অনুযায়ী কাজ করা বন্ধ করে দেয়।

তদ্ব্যতীত, পাঠ্যবক্সে ফলাফলের স্ট্রিং ডিসপ্লেটি সঠিকভাবে তৈরি করার জন্য, কোনওটিকে এটিকে বিভক্ত করতে হবে এবং পাঠ্য সংস্থাকে বরাদ্দ না করে পাঠ্যবক্সের লাইন সম্পত্তি সেট করতে হবে।

this।

উত্স: https://www.codeproject.com/Articles/11902/ কনভার্ট- এইচটিএমএল- টু -প্লেইন- পাঠ্য 2-2


0

আপনি "এইচটিএমএল" বলতে যা বোঝায় তার উপর নির্ভর করে। সবচেয়ে জটিল কেসটি সম্পূর্ণ ওয়েব পৃষ্ঠাগুলি হবে। এটি হ্যান্ডেল করাও সহজ, যেহেতু আপনি একটি পাঠ্য-মোড ওয়েব ব্রাউজার ব্যবহার করতে পারেন। পাঠ্য মোড ব্রাউজার সহ উইকিপিডিয়া নিবন্ধ তালিকা ওয়েব ব্রাউজারগুলি দেখুন । লিঙ্কস সম্ভবত সবচেয়ে পরিচিত, তবে অন্যগুলির মধ্যে একটি আপনার প্রয়োজনের জন্য ভাল হতে পারে।


যেমনটি তিনি বলেছিলেন "আমার কাছে একটি টেবিলের মধ্যে এইচটিএমএল স্নিপেট রয়েছে" "
এম

0

এখানে আমার সমাধান:

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

উদাহরণ:

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

0

আমার একই প্রশ্ন ছিল, কেবল আমার এইচটিএমএলটিতে একটি সাধারণ পূর্ব-পরিচিত লেআউট ছিল, যেমন:

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

সুতরাং আমি এই জাতীয় সহজ কোড ব্যবহার করে শেষ করেছি:

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

কোন ফলাফল:

abc
def

0

লিখেনি তবে ব্যবহার করে:

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 };
    }
  }
}

0

আমি মনে করি এটির একটি সহজ উত্তর আছে:

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

0

নিউলাইন এবং এইচটিএমএল ট্যাগ ছাড়াই প্রদত্ত এইচটিএমএল ডকুমেন্টের পাঠ্য সংক্ষেপণের জন্য ওপি প্রশ্নের সঠিক সমাধান খুঁজছেন এমন যে কেউ, নীচের সমাধানটি সন্ধান করুন।

প্রতিটি প্রস্তাবিত সমাধানের মতো, নীচের কোডটির সাথে কিছু অনুমান রয়েছে:

  • স্ক্রিপ্ট বা স্টাইল ট্যাগগুলিতে স্ক্রিপ্টের অংশ হিসাবে স্ক্রিপ্ট এবং স্টাইল ট্যাগগুলি থাকা উচিত নয়
  • কেবলমাত্র প্রধান ইনলাইন উপাদানগুলি স্থান ছাড়াই ইনলাইন করা হবে, অর্থাৎ he<span>ll</span>oআউটপুট হওয়া উচিত hello। ইনলাইন ট্যাগগুলির তালিকা: https://www.w3schools.com/htmL/html_blocks.asp

উপরের বিষয়টি বিবেচনা করে, সংকলিত নিয়মিত এক্সপ্রেশন সহ নিম্নলিখিত স্ট্রিং এক্সটেনশানটি html পালানো অক্ষর এবং নাল ইনপুটটিতে নাল সম্পর্কিত ক্ষেত্রে প্রত্যাশিত সরল পাঠ্য আউটপুট দেয়।

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);
}

-4

পাবলিক স্ট্যাটিক স্ট্রিং স্ট্রিপট্যাগস 2 (স্ট্রিং এইচটিএমএল) {রিটার্ন এইচটিএমএল। ("<", "<") প্রতিস্থাপন করুন (">", ">"); }

এটির মাধ্যমে আপনি সমস্ত "<" এবং ">" একটি স্ট্রিংয়ে পালাতে পারেন। এই কমান্ডের সাহায্যে আপনি চান কি?


... আহ। ঠিক আছে এখন উত্তর (দ্ব্যর্থক প্রশ্নের ব্যাখ্যার সাথে) পুরোপুরি বদলে গেছে, আমি & amp এর অভাবে নিট বেছে নেব; পরিবর্তে এনকোডিং ;-)
বোবিনস

4
আমি মনে করি না যে চাকাটি পুনরায় উদ্ভাবন করা ভাল - বিশেষত যখন আপনার চাকাটি বর্গক্ষেত্র হয়। পরিবর্তে আপনার HTMLEncode ব্যবহার করা উচিত।
ক্রামি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.