আমি কীভাবে এএসপি.নেট এর স্ট্রিং থেকে এইচটিএমএল ট্যাগগুলি ছাঁটাতে পারি?


123

এএসপি.এনইটি ব্যবহার করে, আমি কীভাবে কোনও প্রদত্ত স্ট্রিং থেকে এইচটিএমএল ট্যাগগুলি নির্ভরযোগ্যভাবে (যেমন রেজেক্স ব্যবহার না করে) ফিরতে পারি? আমি পিএইচপি এর মতো কিছু খুঁজছি strip_tags

উদাহরণ:

<ul><li>Hello</li></ul>

আউটপুট:

"হ্যালো"

আমি চাকাটি পুনরায় উদ্ভাবন না করার চেষ্টা করছি, তবে আমি এখনও পর্যন্ত আমার চাহিদা মেটাতে এমন কোনও জিনিস পাইনি।


আমি কল্পনা করব যে পিএইচপি স্ট্রিপ_ট্যাগগুলি পর্দার আড়ালে রেগেক্স ব্যবহার করে!
স্টিভিওপওয়েল

10
@ ড্যানিয়েল: কারণ রেজেক্স খুব খারাপ, বিশেষ করে যদি আপনি বাসা বাঁধেন।
জোয়েল কোহোর্ন 13

হুম, পিএইচপি-র স্ট্রিপ_ট্যাগগুলি অফিশিয়াল নোট এবং মন্তব্যগুলিতে গিয়ে বিশেষভাবে নির্ভরযোগ্য: ইউ.এফ.পি.পি.এস.
জাফ - বেন ডুগুইড

উত্তর:


112

যদি এটি কেবল একটি স্ট্রিং থেকে সমস্ত এইচটিএমএল ট্যাগগুলি সরিয়ে দেয় তবে এটি কাজ করে নির্ভরযোগ্যভাবে রেগেক্সের সাথেও । প্রতিস্থাপন করুন:

<[^>]*(>|$)

খালি স্ট্রিং সহ, বিশ্বব্যাপী। প্রতিস্থাপন করে স্ট্রিংটি পরে স্বাভাবিক করতে ভুলবেন না:

[\s\r\n]+

একটি একক স্থান সহ, এবং ফলাফল ছাঁটাই। HTMLচ্ছিকভাবে যে কোনও এইচটিএমএল চরিত্র সত্তা প্রকৃত অক্ষরগুলিতে ফিরে আসুন।

বিঃদ্রঃ :

  1. একটি সীমাবদ্ধতা রয়েছে: >বৈশিষ্ট্য মানগুলিতে এইচটিএমএল এবং এক্সএমএল অনুমতি দেয় । এই সমাধান করবে যখন যেমন মান সম্মুখীন ভাঙা মার্কআপ ফিরে যান।
  2. সমাধানটি প্রযুক্তিগতভাবে নিরাপদ, যেমন রয়েছে: ফলাফলটিতে কখনও এমন কিছু থাকবে না যা ক্রস সাইট স্ক্রিপ্টিং করতে বা পৃষ্ঠার বিন্যাসটি ভাঙ্গতে ব্যবহৃত হতে পারে। এটি খুব পরিষ্কার নয়।
  3. সবকিছুর মতো এইচটিএমএল এবং রেজেক্স:
    আপনার যদি সমস্ত পরিস্থিতিতে ডান পেতে হয় তবে সঠিক পার্সার ব্যবহার করুন ।

52
অনুরোধ করা না হলেও, আমি মনে করি অনেক পাঠক এইচটিএম-এনকোডিং পছন্দ করতে চাইবেন, পছন্দ করুন &quote;। আমি এটির WebUtility.HtmlDecodeজন্য এটি একত্রিত করি (যার ফলে ট্যাগগুলি সরানো হবে না)। ট্যাগ-অপসারণের পরে এটি ব্যবহার করুন, যেহেতু এটি পুনরায় লিখতে পারে &gt;এবং &lt;। উদাWebUtility.HtmlDecode(Regex.Replace(myTextVariable, "<[^>]*(>|$)", string.Empty))
ইয়াহু সিরিয়াস

@ ইয়াহু সিরিয়াস একটি উদাহরণ দেওয়ার জন্য আপনাকে ধন্যবাদ। এটি দুর্দান্ত কাজ করে। ধন্যবাদ.
সার্চফোর্ডক্লানজ

এইচটিএমএল অ্যাগিলিটি প্যাকটি যাবার উপায়, আমি সম্পূর্ণ ওয়েব পৃষ্ঠাগুলি সামগ্রী ব্যবহার করার জন্য এটি ওয়েবফর্মগুলিতে ফিরে ব্যবহার করেছি!
বোজাঙ্গলেস

3
@ ইয়াহুসরিয়াস এটি কোনও এক্সএস ভেক্টরকে & gt; এ অনুমতি দেবে; লিপি & lt; সতর্কতা ( "XXS"); & gt; / লিপি & lt; রেইজেক্স দ্বারা স্যানিটাইজ করা হবে না তবে এইচটিএমএল ডেকোড << স্ক্রিপ্ট> সতর্কতা ("XXS") এ রূপান্তরিত হবে; </ স্ক্রিপ্ট>

1
@ হিথার খুব ভাল পয়েন্ট। এইচটিএমএল ট্যাগ স্ট্রিপিং সত্তা ডিকোডিং পরে আবার করতে হবে।
তোমালাক

76

এখনই এইচটিএমএলজিটিপ্যাক ডাউনলোড করুন! ;) লিঙ্ক ডাউনলোড করুন

এটি আপনাকে HTML লোড এবং পার্স করতে দেয়। তারপরে আপনি ডিওএম নেভিগেট করতে পারেন এবং সমস্ত বৈশিষ্ট্যের অভ্যন্তরীণ মানগুলি বের করতে পারেন। সিরিয়াসলি, এটি আপনাকে সর্বোচ্চ 10 লাইন কোড লাগবে take এটি সেখানে সর্বাধিক বিনামূল্যে। নেট লাইব্রেরি।

এখানে একটি নমুনা দেওয়া হল:

            string htmlContents = new System.IO.StreamReader(resultsStream,Encoding.UTF8,true).ReadToEnd();

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(htmlContents);
            if (doc == null) return null;

            string output = "";
            foreach (var node in doc.DocumentNode.ChildNodes)
            {
                output += node.InnerText;
            }

2
এমনকি আপনি প্রতিটি text()নোডকে জিজ্ঞাসা করতে পারেন , বিষয়বস্তুগুলি এবং স্ট্রিংটি ছাঁটাতে পারেন space স্থান সহ তাদের সাথে যোগ দিন। IEnumerable<string> allText = doc.DocumentNode.SelectNodes("//text()").Select(n => n.InnerText.Trim())
jsesehouwing

অথবা কেবল ডক.ডোমামেন্টনোড.ইনার টেক্সট ব্যবহার করুন, যদিও এটি সাদা
অংশে

17
if (doc == null)চেক কেন ? এটা সবসময় মিথ্যা, তাই না?
এভেসে

67
Regex.Replace(htmlText, "<.*?>", string.Empty);

সহজ এবং সুন্দর। ধন্যবাদ!
টিলিটো

5
অনেকগুলি সমস্যা রয়েছে - সেগুলিতে <বা> থাকা অ্যাট্রিবিউটগুলির সাথে ডিল করে না এবং ট্যাগগুলি চালিত না করলে একের বেশি লাইন বিস্তৃত ট্যাগগুলির সাথে ভাল করে না RegexOptions.SingleLine
ক্রিসএফ

2
খুব, "<[^>] *>" ব্যবহার করুন।
পল কেইনিটস

11
protected string StripHtml(string Txt)
{
    return Regex.Replace(Txt, "<(.|\\n)*?>", string.Empty);
}    

Protected Function StripHtml(Txt as String) as String
    Return Regex.Replace(Txt, "<(.|\n)*?>", String.Empty)
End Function

2
অ-ইউনিক্স লাইনব্রেকগুলি সহ অনেকগুলি ক্ষেত্রে কাজ করে না।
ক্রিসএফ

6

আমি এটি এপ নেট ফোরামগুলিতে পোস্ট করেছি এবং এটি এখনও এটি সবচেয়ে সহজ সমাধান বলে মনে হচ্ছে। আমি এটির দ্রুত বা সর্বাধিক দক্ষ গ্যারান্টি দিচ্ছি না তবে এটি বেশ নির্ভরযোগ্য। .NET এ আপনি HTML ওয়েব কন্ট্রোল অবজেক্টগুলি নিজেরাই ব্যবহার করতে পারেন। আপনাকে যা করতে হবে তা হ'ল একটি স্ট্রিমটি কোনও অস্থায়ী এইচটিএমএল আইডিআইবি যেমন ডিআইভিতে সন্নিবেশ করাতে হবে, তারপরে ট্যাগের মধ্যে অন্তর্ভুক্ত নয় এমন সমস্ত টেক্সট ধরার জন্য বিল্ট-ইন 'ইনার টেক্সট' ব্যবহার করুন। একটি সাধারণ সি # উদাহরণের জন্য নীচে দেখুন:


System.Web.UI.HtmlControls.HtmlGenericControl htmlDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
htmlDiv.InnerHtml = htmlString;
String plainText = htmlDiv.InnerText;

এটি কাজ করে বলে মনে হচ্ছে না, আমি এটিকে সাধারণ InnerHtml = "<b> ফু </ b>" দিয়ে পরীক্ষা করেছি; এবং ইনারটেক্সটের মান "<b> ফু </ b>" রয়েছে :(
এক্সারিড্যাক্স

এটি করবেন না। এই সমাধানটি সরাসরি আউটপুটটিতে আন-এনকোডড এইচটিএমএলকে ইনজেকশন দেয়। এটি আপনাকে ক্রস সাইট স্ক্রিপ্টিং আক্রমণগুলির জন্য উন্মুক্ত ছেড়ে দেবে - আপনি এইচটিএমএল স্ট্রিং পরিবর্তন করতে পারে এমন কাউকেই আপনার অ্যাপ্লিকেশনে যেকোন স্বেচ্ছাসেবী এইচটিএমএল এবং জাভাস্ক্রিপ্ট ইনজেক্ট করার অনুমতি দিয়েছেন!
সেল

5

আমি সি # তে একটি খুব দ্রুত পদ্ধতি রচনা করেছি যা রেজেক্স থেকে বেরিয়ে এসেছে। এটি কোডপ্রজেক্টের একটি নিবন্ধে হোস্ট করা হয়েছে ।

এর সুবিধাগুলি হ'ল উন্নত পারফরম্যান্সের মধ্যে নামযুক্ত এবং নম্বরযুক্ত এইচটিএমএল সত্তা (যারা পছন্দ করেন &amp;amp;এবং পছন্দ করেন) প্রতিস্থাপনের ক্ষমতা ability&203; ) এবং মন্তব্য ব্লক প্রতিস্থাপন এবং আরো।

কোডপ্রজেক্ট সম্পর্কিত সম্পর্কিত নিবন্ধটি পড়ুন দয়া করে

ধন্যবাদ.


4

আপনারা যারা এইচটিএমএলিলিটিপ্যাক ব্যবহার করতে পারবেন না তাদের জন্য। নেট এক্স এক্সএমএল রিডার একটি বিকল্প। এটি ভাল ফর্ম্যাটেড এইচটিএমএল এ ব্যর্থ হতে পারে যদিও ব্যাকআপ হিসাবে সর্বদা রেজেক্সের সাথে একটি ক্যাচ যুক্ত করে। নোট করুন এটি দ্রুত নয়, তবে এটি ডিবাগিংয়ের মাধ্যমে পুরানো স্কুল পদক্ষেপের জন্য একটি দুর্দান্ত সুযোগ সরবরাহ করে।

public static string RemoveHTMLTags(string content)
    {
        var cleaned = string.Empty;
        try
        {
            StringBuilder textOnly = new StringBuilder();
            using (var reader = XmlNodeReader.Create(new System.IO.StringReader("<xml>" + content + "</xml>")))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Text)
                        textOnly.Append(reader.ReadContentAsString());
                }
            }
            cleaned = textOnly.ToString();
        }
        catch
        {
            //A tag is probably not closed. fallback to regex string clean.
            string textOnly = string.Empty;
            Regex tagRemove = new Regex(@"<[^>]*(>|$)");
            Regex compressSpaces = new Regex(@"[\s\r\n]+");
            textOnly = tagRemove.Replace(content, string.Empty);
            textOnly = compressSpaces.Replace(textOnly, " ");
            cleaned = textOnly;
        }

        return cleaned;
    }


1

যারা মাইকেল টিপটপের সমাধানটি কাজ করছে না সে সম্পর্কে কমপ্লাই করছেন, তাদের জন্য এখানে নেট নেট ++ উপায়:

public static string StripTags(this string markup)
{
    try
    {
        StringReader sr = new StringReader(markup);
        XPathDocument doc;
        using (XmlReader xr = XmlReader.Create(sr,
                           new XmlReaderSettings()
                           {
                               ConformanceLevel = ConformanceLevel.Fragment
                               // for multiple roots
                           }))
        {
            doc = new XPathDocument(xr);
        }

        return doc.CreateNavigator().Value; // .Value is similar to .InnerText of  
                                           //  XmlDocument or JavaScript's innerText
    }
    catch
    {
        return string.Empty;
    }
}

1
using System.Text.RegularExpressions;

string str = Regex.Replace(HttpUtility.HtmlDecode(HTMLString), "<.*?>", string.Empty);

0

আমি এখানে প্রস্তাবিত রেজেক্স ভিত্তিক সমাধানগুলি দেখেছি এবং তারা সবচেয়ে তুচ্ছ ঘটনা বাদ দিয়ে আমাকে কোনও আত্মবিশ্বাসের সাথে পূরণ করে না। কোনও অ্যাট্রিবিউটের একটি কোণ বন্ধনী এটি ভেঙে ফেলতে হবে, বন্য থেকে ম্যাল-ফর্মযুক্ত এইচটিএমএলকে ছেড়ে দিন। এবং সত্তা কি পছন্দ&amp; ? আপনি যদি এইচটিএমএলকে সরল পাঠ্যে রূপান্তর করতে চান তবে আপনাকে সত্তাও ডিকোড করতে হবে।

সুতরাং আমি নীচের পদ্ধতিটি প্রস্তাব করি।

ব্যবহার HtmlAgilityPack , এই এক্সটেনশানটি পদ্ধতি দক্ষতার একটি HTML টুকরা থেকে সব এইচটিএমএল ট্যাগ রেখাচিত্রমালা। এইচটিএমএল সত্তাদের মতো করেও ডিকোড করে &amp;। প্রতিটি পাঠ্য আইটেমের মধ্যে একটি নতুন লাইন সহ কেবল অভ্যন্তরীণ পাঠ্য আইটেমগুলি দেয়।

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

তুমি আসলেই সিরিয়াস হন, তাহলে আপনি খুব নির্দিষ্ট এইচটিএমএল ট্যাগ বিষয়বস্তু উপেক্ষা করার (চাই চাই <script>, <style>, <svg>, <head>,<object> মনে আসে!) কারণ তারা সম্ভবত ইন্দ্রিয় আমরা পরে হয় পাঠযোগ্য বিষয়বস্তু থাকে না। আপনি সেখানে যা করেন তা আপনার পরিস্থিতি এবং আপনি কতদূর যেতে চান তার উপর নির্ভর করবে, তবে এইচটিএমএলএগ্রিলিপ্যাকটি ব্যবহার করা শ্বেতলিস্ট বা নির্বাচিত ট্যাগগুলিকে কালো তালিকাভুক্ত করা বেশ নগণ্য হবে।

আপনি একটি HTML পৃষ্ঠার বিষয়বস্তু ফিরে রেন্ডারিং হয়, আপনি XSS দুর্বলতা ও বুঝতে নিশ্চিত কিভাবে এটা রোধ করার জন্য - অর্থাৎ সবসময় কোনো ব্যবহারকারী-প্রবেশ পাঠ্য একটি HTML পৃষ্ঠা (সম্মুখের ফিরে অনুষ্ঠিত পরার এনকোড >হয়ে &gt;ইত্যাদি)।


0

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

public string StripTags(HtmlNode documentNode, IList keepTags)
{
    var result = new StringBuilder();
        foreach (var childNode in documentNode.ChildNodes)
        {
            if (childNode.Name.ToLower() == "#text")
            {
                result.Append(childNode.InnerText);
            }
            else
            {
                if (!keepTags.Contains(childNode.Name.ToLower()))
                {
                    result.Append(StripTags(childNode, keepTags));
                }
                else
                {
                    result.Append(childNode.OuterHtml.Replace(childNode.InnerHtml, StripTags(childNode, keepTags)));
                }
            }
        }
        return result.ToString();
    }

এই পৃষ্ঠায় আরো ব্যাখ্যা: http://nalgorithm.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/


0

আপনি অ্যাঙ্গেলশার্প দিয়ে এটিও করতে পারেন যা এইচটিএমএলিলিটিপ্যাকের বিকল্প (এইচএপি খারাপ নয়)। এইচটিএমএল উত্স থেকে পাঠ্যটি বের করার জন্য HAP এর চেয়ে ব্যবহার করা সহজ।

var parser = new HtmlParser();
var htmlDocument = parser.ParseDocument(source);
var text = htmlDocument.Body.Text();

আপনি মূল বৈশিষ্ট্য বিভাগে একবার দেখে নিতে পারেন যেখানে তারা HAP থেকে "আরও ভাল" হওয়ার ক্ষেত্রে একটি মামলা করে। আমি বেশিরভাগ অংশের জন্য মনে করি, এটি সম্ভবত বর্তমান প্রশ্নের জন্য অতিমাত্রার চেয়ে বেশি তবে এখনও, এটি একটি আকর্ষণীয় বিকল্প।


-4

সহজভাবে ব্যবহার string.StripHTML();


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