এইচটিএমএল ট্যাগগুলি মুছে ফেলার জন্য সি # নিয়মিত এক্সপ্রেশন ব্যবহার করা


139

অ্যাঙ্গেল বন্ধনী সহ সমস্ত এইচটিএমএল ট্যাগ প্রতিস্থাপন / অপসারণের জন্য আমি কীভাবে সি # নিয়মিত অভিব্যক্তি ব্যবহার করব? কেউ দয়া করে কোডটি সম্পর্কে আমাকে সহায়তা করতে পারেন?



আপনি এটি ইঙ্গিত করেন না, তবে আমি অনুমান করছি যে আপনি স্ক্রিপ্ট এবং শৈলী উপাদানগুলি সম্পূর্ণরূপে সরাতে চান এবং কেবল ট্যাগটি সরাতে চান না। ট্যাগগুলি মুছে ফেলার জন্য নীচের এইচটিএমএল এগ্রিলিটি প্যাকের উত্তরটি সঠিক, তবে স্ক্রিপ্ট এবং স্টাইলটি সরাতে আপনারও স্ট্যাকওভারফ্লো.com
জন

1
সদৃশ হিসাবে নির্দেশিত প্রশ্নটির অনেক তথ্য রয়েছে (এবং টনি দি টনি!) তবে এটি কেবল ট্যাগ খোলার জন্য বলেছিল, সমস্ত ট্যাগ নয়। সুতরাং আমি নিশ্চিত না যে এটি প্রযুক্তিগতভাবে একটি সদৃশ। বলেছিল, উত্তর একটাই: না।
goodeye

উত্তর:


154

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

আপনি নিম্নলিখিত ব্যবহার করতে পারে।

String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);

এটি বেশিরভাগ ক্ষেত্রে কাজ করবে, তবে এমন কেস থাকবে (উদাহরণস্বরূপ সিডিটিএ এঙ্গেল বন্ধনী রয়েছে) যেখানে এটি প্রত্যাশার মতো কাজ করবে না।


13
এটি একটি নিষ্পাপ বাস্তবায়ন .. এটি হ'ল <div id = "x <4>"> দুর্ভাগ্যক্রমে, বৈধ এইচটিএমএল। যদিও সবচেয়ে বুদ্ধিমান কেসগুলি পরিচালনা করে ..
রায়ান ইমারেল

8
যেমনটি বলা হয়েছে, আমি সচেতন যে এই মত প্রকাশ কিছু ক্ষেত্রে ব্যর্থ হবে। আমিও নিশ্চিত নই যে সাধারণ কেসটি কোনও ত্রুটি ছাড়াই নিয়মিত প্রকাশ দ্বারা পরিচালনা করা যায় কিনা।
ড্যানিয়েল ব্রুকনার

1
না এটি সব ক্ষেত্রেই ব্যর্থ হবে! এটি লোভী।
জেক

13
@ সাইফার, আপনি কেন লোভকে সমস্যা বলে মনে করেন? ধরে নিই ম্যাচটি কোনও বৈধ এইচটিএমএল ট্যাগের শুরুতে শুরু হয়, এটি কখনই সেই ট্যাগটির শেষের পরে প্রসারিত হবে না। [^>] এর জন্য এটিই।
অ্যালান মুর

1
@ অ্যালানমুর এইচটিএমএল একটি "নিয়মিত ভাষা" নয়, অর্থাত্ আপনি রেগেক্সেসের সাথে বৈধ এইচটিএমএল যাবতীয় জিনিস সঠিকভাবে মেলাতে পারবেন না। দেখুন: stackoverflow.com/questions/590747/...
Kache

78

সঠিক উত্তরটি তা করবেন না, এইচটিএমএল অ্যাগিলিটি প্যাকটি ব্যবহার করুন ।

যুক্ত করতে সম্পাদিত:

নীচে দেওয়া জেসির মাধ্যমে মন্তব্য থেকে নির্লজ্জভাবে চুরি করতে, এবং এত সময়ের পরেও প্রশ্নের উত্তর অপ্রতুলতার সাথে এড়াতে এড়াতে, এইচটিএমএল অ্যাগ্রিলিটি প্যাকটি ব্যবহার করে একটি সাধারণ, নির্ভরযোগ্য স্নিপেট যা এইচটিএমএল-এরও সবচেয়ে অসম্পূর্ণভাবে গঠিত, মজাদার বিটগুলির সাথে কাজ করে:

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

এইচটিএমএল পার্স করার জন্য একটি নিয়মিত এক্সপ্রেশন ব্যবহার করার জন্য খুব কম সংখ্যক ডিফেন্সযোগ্য কেস রয়েছে, কারণ প্রসঙ্গ-সচেতনতা ছাড়াই এইচটিএমএলকে সঠিকভাবে পার্স করা যায় না যা কোনও নন ট্র্যাডিশনাল রেজেক্স ইঞ্জিনে সরবরাহ করা খুব বেদনাদায়ক। আপনি একটি রেজিএক্সের সাহায্যে আংশিক উপায় পেতে পারেন, তবে আপনাকে ম্যানুয়াল যাচাইকরণ করতে হবে।

এইচটিএমএল অ্যাগিলিটি প্যাক আপনাকে একটি শক্তিশালী সমাধান সরবরাহ করতে পারে যা ম্যানুয়ালি এই প্রবণতাগুলিকে ঠিক করার প্রয়োজন হ্রাস করবে যা প্রচ্ছন্ন ব্যাকরণ হিসাবে নির্বিচারে এইচটিএমএলকে চিকিত্সা করার ফলে তৈরি হতে পারে।

একটি নিয়মিত প্রকাশ আপনাকে বেশিরভাগ সময় যা চায় তা পেতে পারে তবে এটি খুব সাধারণ ক্ষেত্রে ব্যর্থ হবে। আপনি যদি এইচটিএমএল এগ্রিলিটি প্যাকের চেয়ে আরও ভাল / দ্রুত পার্সার সন্ধান করতে পারেন তবে এটির জন্য যান তবে দয়া করে বিশ্বকে আরও ভাঙ্গা এইচটিএমএল হ্যাকারির अधीनमा রাখবেন না।


27
এইচটিএমএল অ্যাগ্রিলিটি প্যাক HTML সহ কাজ করার সাথে সম্পর্কিত সমস্ত কিছুর উত্তর নয় (যেমন আপনি যদি কেবল HTML কোডের টুকরো দিয়ে কাজ করতে চান তবে কী করবেন ?!)।
প্রোপেলারহিড

7
এটি এইচটিএমএলের টুকরো টুকরো টুকরো করে কাজ করে এবং মূল পোস্টার দ্বারা বর্ণিত দৃশ্যের জন্য এটি সর্বোত্তম বিকল্প। অন্যদিকে, একটি রেজেক্স কেবলমাত্র একটি আদর্শিক এইচটিএমএল নিয়ে কাজ করে এবং পুরোপুরি বৈধ এইচটিএমএল সহ ভেঙে যায়, কারণ এইচটিএমএলের ব্যাকরণ নিয়মিত নয়। তিনি যদি রুবি ব্যবহার করতেন তবে আমি পাইথনের জন্য নোকোগিরি বা এইপ্রিকোট বা বিউটিউসসপ প্রস্তাব করতাম। এইচটিএমএল এর মতো চিকিত্সা করা ভাল, ব্যাকরণ ছাড়া কিছু স্বেচ্ছাসেবী পাঠ্য প্রবাহ নয়।
জেসনট্রু

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

20
এটি মতামতের বিষয় নয়। একটি নিয়মিত প্রকাশ আপনাকে বেশিরভাগ সময় যা চায় তা পেতে পারে তবে এটি খুব সাধারণ ক্ষেত্রে ব্যর্থ হবে। আপনি যদি এইচটিএমএল এগ্রিলিটি প্যাকের চেয়ে আরও ভাল / দ্রুত পার্সার সন্ধান করতে পারেন তবে এটির জন্য যান তবে দয়া করে বিশ্বকে আরও ভাঙ্গা এইচটিএমএল হ্যাকারির अधीनमा রাখবেন না।
জেসনট্রু

2
আপনি HTML টি পার্সিং ব্যতীত নির্ভরযোগ্যভাবে এইচটিএমএল ট্যাগগুলি সনাক্ত করতে পারবেন না। আপনি কি এইচটিএমএল এর ব্যাকরণ সব বুঝতে পারেন? অন্যান্য উত্তরগুলি পরামর্শ দেয় "বেশ কাছাকাছি" পেতে দুষ্ট হ্যাক দেখুন এবং আপনি কেন এটি বজায় রাখতে চান তা আমাকে বলুন। আমাকে হতাশ করা কারণ একটি নমুনা দ্রুত প্রচেষ্টা আপনার নমুনা ইনপুটটির জন্য কাজ করে যা আপনার সমাধানটিকে সঠিক করে তুলবে না। আমি মাঝে মধ্যে এইচটিএমএল বিষয়বস্তু থেকে রিপোর্ট উত্পন্ন উত্সাহগুলি ব্যবহার করেছি বা & জিটিতে নেতিবাচক মিলটি ব্যবহার করে কিছু সিএসএস রেফারেন্স ঠিক করতে; ত্রুটির সম্ভাবনা সীমাবদ্ধ করতে, তবে আমরা অতিরিক্ত যাচাইকরণ করেছি; এটি সাধারণ উদ্দেশ্য ছিল না।
জেসনট্রু

38

প্রশ্নটির যথার্থ উত্তর দেওয়া খুব বিস্তৃত। আপনি কি ওয়েব পৃষ্ঠার মতো একটি বাস্তব-বিশ্বের HTML ডকুমেন্ট থেকে সমস্ত ট্যাগ সরিয়ে দেওয়ার বিষয়ে কথা বলছেন? যদি তা হয় তবে আপনাকে তা করতে হবে:

  • <! ডক্টইপিই ঘোষণা বা <? এক্সএমএল প্রলোগ উপস্থিত থাকলে তাদের সরিয়ে দিন
  • সমস্ত এসজিএমএল মন্তব্যগুলি সরান
  • সম্পূর্ণ হেড উপাদানটি মুছে ফেলুন
  • সমস্ত স্ক্রিপ্ট এবং স্টাইল উপাদান মুছে ফেলুন
  • ফোর্ব এবং টেবল উপাদানগুলির সাথে গ্র্যাথথার-কী জানেন
  • বাকি ট্যাগগুলি মুছে ফেলুন
  • সিডিএটিএ বিভাগগুলি থেকে <! [সিডিএটিএ [এবং]]> সিকোয়েন্সগুলি সরান তবে সেগুলির বিষয়বস্তু একা রেখে দিন

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

তবে, ধরে নিই যে আপনি কেবল একটি খণ্ডের সাথে কাজ করছেন এবং আপনি কেবল সমস্ত ট্যাগ অপসারণ করে পালিয়ে যেতে পারেন, আমি যে রেজেক্সটি ব্যবহার করব তা এখানে:

@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"

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

আপনি যদি এই নির্মাণগুলি সম্পর্কে ভাবছেন তবে (?>...)তারা পারমাণবিক দল । তারা রেজেক্সকে কিছুটা দক্ষ করে তোলে, তবে আরও গুরুত্বপূর্ণ, তারা পালিয়ে যাওয়া ব্যাকট্র্যাকিংয়ের প্রতিরোধ করে, যা আপনি যখনই করেছি বিকল্প এবং নেস্টেড কোয়ান্টিফায়ারগুলিকে মিশ্রিত করেন তখন আপনার সর্বদা নজর রাখা উচিত। আমি এখানে সত্যিই সমস্যা বলে মনে করি না, তবে আমি জানি যদি আমি এটি উল্লেখ না করি তবে অন্য কেউ হবে। ;-)

এই রেজেক্স অবশ্যই নিখুঁত নয়, তবে এটি সম্ভবত আপনার প্রয়োজনের মতোই ভাল।


1
এটি এখন পর্যন্ত সেরা উত্তর। আপনি পোস্টারের প্রশ্নের উত্তর দিয়েছেন এবং ব্যাখ্যা করেছেন যে প্রদত্ত কাজের জন্য নিয়মিত প্রকাশটি কেন ব্যবহার করা উচিত নয়। সাবাশ.
JWilliams


18

@ জেসনট্রু সঠিক, এটি এইচটিএমএল ট্যাগগুলি নিয়মিত প্রকাশের মাধ্যমে করা উচিত নয়।

এইচটিএমএলএজিলিটিপ্যাক ব্যবহার করে এইচটিএমএল ট্যাগগুলি ছাঁটাই করা বেশ সহজ:

public string StripTags(string input) {
    var doc = new HtmlDocument();
    doc.LoadHtml(input ?? "");
    return doc.DocumentNode.InnerText;
}

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

অন্য সমস্ত কিছুর ব্যর্থতা যখন মনে হয়েছিল, এই সাধারণ কোড স্নিপেটটি দিনটি সংরক্ষণ করেছিল। ধন্যবাদ!
টেড ক্রাপফ

14

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

আমার এমন কিছু এইচটিএমএল দিয়ে কাজ করা দরকার যা সবসময় মজাদার এবং গেমস সমৃদ্ধ পাঠ্য সম্পাদক দ্বারা তৈরি করা হয়েছিল।

এই ক্ষেত্রে আপনার নিজের কিছু ট্যাগের পাশাপাশি কিছু ট্যাগের সামগ্রী মুছে ফেলতে হবে।

আমার ক্ষেত্রে এবং ট্যাগগুলি এই মিশ্রণে ফেলে দেওয়া হয়েছিল। কেউ আমার (খুব সামান্য) কম নিখুঁত বাস্তবায়নকে একটি কার্যকর শুরুর পয়েন্ট মনে করতে পারেন।

   /// <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"
    }

1
সুস্পষ্ট ক্রসপ্ল্যাটফর্ম লাইনব্রেক সমস্যাগুলি ছাড়াও, যখন বিষয়বস্তুটি সীমিত করা হয় তখন একটি অসম্পূর্ণ কোয়ান্টিফায়ার থাকা ধীর হয়। মত ব্যবহার করুন কিছু <xml>.*(?!</xml>)</xml>সঙ্গে RegexOptions.SingleLineপ্রথম দুই পরিবর্তক এবং <[^>]*>গত জন্য। প্রথম ট্যাগগুলিকে প্রথম ট্যাগের নামে বন্দী রদবদল এবং এটির নেতিবাচক চেহারা এবং চূড়ান্ত ট্যাগের পিছনে উল্লেখের মাধ্যমেও একত্রিত হতে পারে।
ক্রিসএফ

5

এই ইউআরএলে নিয়মিত প্রকাশের পদ্ধতিটি চেষ্টা করুন : 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);
}

3

এটা ব্যবহার কর..

@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"


-1

ট্যাগগুলি সরাতে এই পদ্ধতিটি ব্যবহার করুন:

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, ""));
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.