সি # তে & nbsp সহ স্ট্রিং থেকে এইচটিএমএল ট্যাগগুলি সরান


83

আমি কীভাবে সি # তে রেজেক্স ব্যবহার করে & nbsp সহ সমস্ত এইচটিএমএল ট্যাগগুলি সরিয়ে ফেলতে পারি। আমার স্ট্রিং দেখে মনে হচ্ছে

  "<div>hello</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>"

9
একটি রেজেক্স ব্যবহার করবেন না, এইচটিএমএল অ্যাগিলিটি প্যাকটি দেখুন। stackoverflow.com/questions/846994/how-to-use-html-agility-pack
টিম

ধন্যবাদ টিম, তবে অ্যাপ্লিকেশনটি বেশ বড় এবং অক্ষত, এইচটিএমএল চপলতা প্যাক যুক্ত বা ডাউনলোড করা কার্যকর হবে না।
রামপুরীয়া

উত্তর:


198

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

string noHTML = Regex.Replace(inputHTML, @"<[^>]+>|&nbsp;", "").Trim();

আপনার আদর্শভাবে একটি রেজেক্স ফিল্টার দিয়ে অন্য পাস করা উচিত যা একাধিক স্পেস হিসাবে যত্ন নেয়

string noHTMLNormalised = Regex.Replace(noHTML, @"\s{2,}", " ");

আমি এখনও আমার যতটুকু প্রয়োজন তা পরীক্ষা করে দেখিনি, তবে এটি কাজ করার প্রত্যাশার চেয়ে এটি আরও ভাল কাজ করেছে। আমি নীচে লেখা পদ্ধতি পোস্ট করব।
ডন রোলিং

একটি অলস ম্যাচ ( <[^>]+?>@ ডেভিড এস অনুসারে) এটি একটি বাচ্চাকে দ্রুততর করে তুলতে পারে, তবে কেবলমাত্র একটি লাইভ প্রকল্পে এই সমাধানটি ব্যবহার করেছে - খুব খুশি +1 :)
কোডিং গেছে

Regex.Replace (ইনপুটএইচটিএমএল, @ "<[^>] +> | & nbsp | \ n;", "")। ট্রিম (); removed n সরানো হচ্ছে না
মহেশ মালপানী

4
আমি খালি স্ট্রিংয়ের পরিবর্তে কোনও জায়গার বিজ্ঞাপন দেওয়ার পরামর্শ দেব, আমরা যে কোনও উপায়ে অতিরিক্ত স্পেস খুঁজে নিচ্ছিRegex.Replace(inputHTML, @"<[^>]+>|&nbsp;", " ")
তৌসিফ

4
@ তৌসিফ আপনি যদি প্রথম প্রতিস্থাপন কলটিতে কোনও স্থান ব্যবহার করেন তবে আপনি এমন জায়গা ছেড়ে দিতে পারেন যেখানে মূল ইনপুটটিতে কিছুই ছিল না। বলুন আপনি Sound<b>Cloud</b>একটি ইনপুট হিসাবে গ্রহণ ; Sound Cloudএটি ছিনতাইয়ের সময় শেষ হয়ে যাবে SoundCloudকারণ এটি এইচটিএমএলে প্রদর্শিত হয়।
রবি কে থাপলিয়াল

31

আমি @ রবি থাপলিয়ালের কোড নিয়েছি এবং একটি পদ্ধতি তৈরি করেছি: এটি সহজ এবং সম্ভবত সবকিছু পরিষ্কার করা যায় না, তবে এখনও পর্যন্ত এটি আমার যা করা দরকার তা করছে is

public static string ScrubHtml(string value) {
    var step1 = Regex.Replace(value, @"<[^>]+>|&nbsp;", "").Trim();
    var step2 = Regex.Replace(step1, @"\s{2,}", " ");
    return step2;
}

16

আমি এই ফাংশনটি কিছুক্ষণ ব্যবহার করছি using আপনি এটি ফেলে দিতে পারেন এমন কোনও অগোছালো এইচটিএমএল সরিয়ে দেয় এবং পাঠ্য অক্ষত রেখে দেয়।

        private static readonly Regex _tags_ = new Regex(@"<[^>]+?>", RegexOptions.Multiline | RegexOptions.Compiled);

        //add characters that are should not be removed to this regex
        private static readonly Regex _notOkCharacter_ = new Regex(@"[^\w;&#@.:/\\?=|%!() -]", RegexOptions.Compiled);

        public static String UnHtml(String html)
        {
            html = HttpUtility.UrlDecode(html);
            html = HttpUtility.HtmlDecode(html);

            html = RemoveTag(html, "<!--", "-->");
            html = RemoveTag(html, "<script", "</script>");
            html = RemoveTag(html, "<style", "</style>");

            //replace matches of these regexes with space
            html = _tags_.Replace(html, " ");
            html = _notOkCharacter_.Replace(html, " ");
            html = SingleSpacedTrim(html);

            return html;
        }

        private static String RemoveTag(String html, String startTag, String endTag)
        {
            Boolean bAgain;
            do
            {
                bAgain = false;
                Int32 startTagPos = html.IndexOf(startTag, 0, StringComparison.CurrentCultureIgnoreCase);
                if (startTagPos < 0)
                    continue;
                Int32 endTagPos = html.IndexOf(endTag, startTagPos + 1, StringComparison.CurrentCultureIgnoreCase);
                if (endTagPos <= startTagPos)
                    continue;
                html = html.Remove(startTagPos, endTagPos - startTagPos + endTag.Length);
                bAgain = true;
            } while (bAgain);
            return html;
        }

        private static String SingleSpacedTrim(String inString)
        {
            StringBuilder sb = new StringBuilder();
            Boolean inBlanks = false;
            foreach (Char c in inString)
            {
                switch (c)
                {
                    case '\r':
                    case '\n':
                    case '\t':
                    case ' ':
                        if (!inBlanks)
                        {
                            inBlanks = true;
                            sb.Append(' ');
                        }   
                        continue;
                    default:
                        inBlanks = false;
                        sb.Append(c);
                        break;
                }
            }
            return sb.ToString().Trim();
        }

কেবলমাত্র নিশ্চিত করার জন্য: একক স্পেসট্রেডট্রিম () ফাংশনটি স্ট্রিং নো এইচটিএমএলএনমর্মালাইজড = রিজেক্স.রপ্লেস (নো এইচটিএমএল, @ "\ এস {2,}", "") হিসাবে একই কাজ করে; রবি থাপলিয়ালের উত্তর থেকে?
জিমি

@ জিমি যতদূর আমি দেখতে পাচ্ছি, রেজেক্স একক ট্যাব বা নিউলাইনগুলিকে সিঙ্গেলস্প্রেডট্রিম () এর মতো ধরতে পারে না। এটি একটি কাঙ্ক্ষিত প্রভাব হতে পারে যদিও সেই ক্ষেত্রে কেবল প্রয়োজন হিসাবে কেসগুলি সরিয়ে ফেলুন।
ডেভিড এস

দুর্দান্ত, তবে মনে হচ্ছে এটি একা এবং ডাবল উদ্ধৃতিগুলিও ফাঁকা ফাঁকা স্থানের সাথে প্রতিস্থাপন করবে, যদিও তারা " নোটক্যাকার্টার " তালিকায় নেই, বা আমি সেখানে কিছু অনুপস্থিত রয়েছি? ডিকোডিং / এনকোডিং মেটহোডগুলির এই অংশটি কি শুরুতে বলা হয়? এই চরিত্রগুলি অক্ষত রাখার জন্য কী প্রয়োজন হবে?
vm370


1

আমি @ রাভি থাপলিয়াল এবং @ ডন রোলিংয়ের কোড ব্যবহার করেছি তবে কিছুটা পরিবর্তন করেছি। যেহেতু আমরা & nbsp টি খালি স্ট্রিংয়ের সাথে প্রতিস্থাপন করছি তবে পরিবর্তে & nbsp স্থানের সাথে প্রতিস্থাপন করা উচিত, তাই অতিরিক্ত পদক্ষেপ যুক্ত করা হয়েছে। এটি আমার জন্য কবজির মতো কাজ করেছিল।

public static string FormatString(string value) {
    var step1 = Regex.Replace(value, @"<[^>]+>", "").Trim();
    var step2 = Regex.Replace(step1, @"&nbsp;", " ");
    var step3 = Regex.Replace(step2, @"\s{2,}", " ");
    return step3;
}

সেমিকোলন ছাড়াই ব্যবহৃত & এনবিপিএস কারণ এটি স্ট্যাক ওভারফ্লো দ্বারা ফর্ম্যাট হচ্ছে।


0

এই:

(<.+?> | &nbsp;)

কোনও ট্যাগের সাথে মেলে বা &nbsp;

string regex = @"(<.+?>|&nbsp;)";
var x = Regex.Replace(originalString, regex, "").Trim();

তারপরে x = hello


0

এইচটিএমএল ডকুমেন্টকে স্যানিটাইজ করাতে অনেক জটিল বিষয় জড়িত। এই প্যাকেজটি হয়ত সহায়তার জন্য: https://github.com/mganss/HtmlSanitizer


আমি মনে করি এটি এইচটিএমএলকে স্বাভাবিক করার চেয়ে এক্সএসএসের আক্রমণগুলির চেয়ে আরও বেশি বার হয়েছে
প্রকৃত

4
@ স্পষ্টতই আমি মনে করি আপনি ঠিক বলেছেন। তারা আমার এইচটিএমএল ট্যাগগুলি সরিয়ে নেওয়ার উদ্দেশ্যটি উল্লেখ না করায় আমার উত্তর ওপি-র প্রশ্নের সাথে খুব বেশি সম্পর্কিত নয়। তবে যদি আক্রমণটি প্রতিরোধের উদ্দেশ্য হয়, যেমনটি অনেক ক্ষেত্রে হয় তবে ইতিমধ্যে উন্নত স্যানিটাইজার ব্যবহার করা আরও ভাল পদ্ধতির হতে পারে। বিটিডাব্লু এইচটিএমএলকে স্বাভাবিক করার অর্থ কী তা সম্পর্কে আমার কোনও জ্ঞান নেই ।
এহসান 88

0

এইচটিএমএল কেবলমাত্র এক্সএমএল এর মূল ফর্ম হয়। আপনি একটি এক্সএমএল ডকুমেন্ট অবজেক্টে আপনার পাঠ্যকে পার্স করতে পারবেন এবং মূল উপাদানটিতে পাঠ্যটি বের করার জন্য ইনারটেক্সট কল করুন। এটি যে কোনও আকারের সমস্ত এইচটিএমএল টেজেগুলি কেটে ফেলবে এবং & lt; এর মতো বিশেষ অক্ষরগুলির সাথেও ডিল করবে; & nbsp; সব একসাথে


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