অ্যাঙ্গেল বন্ধনী সহ সমস্ত এইচটিএমএল ট্যাগ প্রতিস্থাপন / অপসারণের জন্য আমি কীভাবে সি # নিয়মিত অভিব্যক্তি ব্যবহার করব? কেউ দয়া করে কোডটি সম্পর্কে আমাকে সহায়তা করতে পারেন?
অ্যাঙ্গেল বন্ধনী সহ সমস্ত এইচটিএমএল ট্যাগ প্রতিস্থাপন / অপসারণের জন্য আমি কীভাবে সি # নিয়মিত অভিব্যক্তি ব্যবহার করব? কেউ দয়া করে কোডটি সম্পর্কে আমাকে সহায়তা করতে পারেন?
উত্তর:
হিসাবে প্রায়শই আগে বলা হয়েছে, এক্সএমএল বা এইচটিএমএল ডকুমেন্টগুলি প্রক্রিয়া করার জন্য আপনার নিয়মিত অভিব্যক্তি ব্যবহার করা উচিত নয়। তারা এইচটিএমএল এবং এক্সএমএল নথিগুলির সাথে খুব ভাল সম্পাদন করে না, কারণ কোনও সাধারণ উপায়ে নেস্টেড স্ট্রাকচারগুলি প্রকাশ করার কোনও উপায় নেই।
আপনি নিম্নলিখিত ব্যবহার করতে পারে।
String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);
এটি বেশিরভাগ ক্ষেত্রে কাজ করবে, তবে এমন কেস থাকবে (উদাহরণস্বরূপ সিডিটিএ এঙ্গেল বন্ধনী রয়েছে) যেখানে এটি প্রত্যাশার মতো কাজ করবে না।
সঠিক উত্তরটি তা করবেন না, এইচটিএমএল অ্যাগিলিটি প্যাকটি ব্যবহার করুন ।
যুক্ত করতে সম্পাদিত:
নীচে দেওয়া জেসির মাধ্যমে মন্তব্য থেকে নির্লজ্জভাবে চুরি করতে, এবং এত সময়ের পরেও প্রশ্নের উত্তর অপ্রতুলতার সাথে এড়াতে এড়াতে, এইচটিএমএল অ্যাগ্রিলিটি প্যাকটি ব্যবহার করে একটি সাধারণ, নির্ভরযোগ্য স্নিপেট যা এইচটিএমএল-এরও সবচেয়ে অসম্পূর্ণভাবে গঠিত, মজাদার বিটগুলির সাথে কাজ করে:
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());
এইচটিএমএল পার্স করার জন্য একটি নিয়মিত এক্সপ্রেশন ব্যবহার করার জন্য খুব কম সংখ্যক ডিফেন্সযোগ্য কেস রয়েছে, কারণ প্রসঙ্গ-সচেতনতা ছাড়াই এইচটিএমএলকে সঠিকভাবে পার্স করা যায় না যা কোনও নন ট্র্যাডিশনাল রেজেক্স ইঞ্জিনে সরবরাহ করা খুব বেদনাদায়ক। আপনি একটি রেজিএক্সের সাহায্যে আংশিক উপায় পেতে পারেন, তবে আপনাকে ম্যানুয়াল যাচাইকরণ করতে হবে।
এইচটিএমএল অ্যাগিলিটি প্যাক আপনাকে একটি শক্তিশালী সমাধান সরবরাহ করতে পারে যা ম্যানুয়ালি এই প্রবণতাগুলিকে ঠিক করার প্রয়োজন হ্রাস করবে যা প্রচ্ছন্ন ব্যাকরণ হিসাবে নির্বিচারে এইচটিএমএলকে চিকিত্সা করার ফলে তৈরি হতে পারে।
একটি নিয়মিত প্রকাশ আপনাকে বেশিরভাগ সময় যা চায় তা পেতে পারে তবে এটি খুব সাধারণ ক্ষেত্রে ব্যর্থ হবে। আপনি যদি এইচটিএমএল এগ্রিলিটি প্যাকের চেয়ে আরও ভাল / দ্রুত পার্সার সন্ধান করতে পারেন তবে এটির জন্য যান তবে দয়া করে বিশ্বকে আরও ভাঙ্গা এইচটিএমএল হ্যাকারির अधीनमा রাখবেন না।
প্রশ্নটির যথার্থ উত্তর দেওয়া খুব বিস্তৃত। আপনি কি ওয়েব পৃষ্ঠার মতো একটি বাস্তব-বিশ্বের HTML ডকুমেন্ট থেকে সমস্ত ট্যাগ সরিয়ে দেওয়ার বিষয়ে কথা বলছেন? যদি তা হয় তবে আপনাকে তা করতে হবে:
এটাই আমার মাথার উপরের অংশে - আমি নিশ্চিত যে আরও কিছু আছে। একবার আপনি সমস্ত কিছু সম্পন্ন করার পরে, আপনি শব্দ, বাক্য এবং অনুচ্ছেদগুলি কিছু জায়গায় একসাথে চলতে শুরু করবেন এবং অন্যদের মধ্যে অব্যবহীন সাদা জায়গার বড় অংশ।
তবে, ধরে নিই যে আপনি কেবল একটি খণ্ডের সাথে কাজ করছেন এবং আপনি কেবল সমস্ত ট্যাগ অপসারণ করে পালিয়ে যেতে পারেন, আমি যে রেজেক্সটি ব্যবহার করব তা এখানে:
@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"
নিজস্ব বিকল্পগুলিতে একক এবং ডাবল-কোটযুক্ত স্ট্রিংগুলির সাথে মান মিলিয়ে রাখা গুণাবলীগুলিতে অ্যাঙ্গেল বন্ধনীগুলির সমস্যাটি মোকাবেলা করার জন্য যথেষ্ট। রায়ের উত্তরের রেজেক্সের মতো, ট্যাগের অভ্যন্তরে বিশিষ্টতার নাম এবং অন্যান্য স্টাফের সাথে সুস্পষ্টভাবে মেলে দেখার কোনও প্রয়োজন আমি দেখতে পাচ্ছি না; প্রথম বিকল্পটি সব পরিচালনা করে।
আপনি যদি এই নির্মাণগুলি সম্পর্কে ভাবছেন তবে (?>...)
তারা পারমাণবিক দল । তারা রেজেক্সকে কিছুটা দক্ষ করে তোলে, তবে আরও গুরুত্বপূর্ণ, তারা পালিয়ে যাওয়া ব্যাকট্র্যাকিংয়ের প্রতিরোধ করে, যা আপনি যখনই করেছি বিকল্প এবং নেস্টেড কোয়ান্টিফায়ারগুলিকে মিশ্রিত করেন তখন আপনার সর্বদা নজর রাখা উচিত। আমি এখানে সত্যিই সমস্যা বলে মনে করি না, তবে আমি জানি যদি আমি এটি উল্লেখ না করি তবে অন্য কেউ হবে। ;-)
এই রেজেক্স অবশ্যই নিখুঁত নয়, তবে এটি সম্ভবত আপনার প্রয়োজনের মতোই ভাল।
Regex regex = new Regex(@"</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>", RegexOptions.Singleline);
@ জেসনট্রু সঠিক, এটি এইচটিএমএল ট্যাগগুলি নিয়মিত প্রকাশের মাধ্যমে করা উচিত নয়।
এইচটিএমএলএজিলিটিপ্যাক ব্যবহার করে এইচটিএমএল ট্যাগগুলি ছাঁটাই করা বেশ সহজ:
public string StripTags(string input) {
var doc = new HtmlDocument();
doc.LoadHtml(input ?? "");
return doc.DocumentNode.InnerText;
}
আমি জেসনের প্রতিক্রিয়া প্রতিধ্বনিত করতে চাই যদিও কখনও কখনও আপনাকে নির্লজ্জভাবে কিছু এইচটিএমএল বিশ্লেষণ করতে এবং পাঠ্য সামগ্রীটি বের করতে হয়।
আমার এমন কিছু এইচটিএমএল দিয়ে কাজ করা দরকার যা সবসময় মজাদার এবং গেমস সমৃদ্ধ পাঠ্য সম্পাদক দ্বারা তৈরি করা হয়েছিল।
এই ক্ষেত্রে আপনার নিজের কিছু ট্যাগের পাশাপাশি কিছু ট্যাগের সামগ্রী মুছে ফেলতে হবে।
আমার ক্ষেত্রে এবং ট্যাগগুলি এই মিশ্রণে ফেলে দেওয়া হয়েছিল। কেউ আমার (খুব সামান্য) কম নিখুঁত বাস্তবায়নকে একটি কার্যকর শুরুর পয়েন্ট মনে করতে পারেন।
/// <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"
}
<xml>.*(?!</xml>)</xml>
সঙ্গে RegexOptions.SingleLine
প্রথম দুই পরিবর্তক এবং <[^>]*>
গত জন্য। প্রথম ট্যাগগুলিকে প্রথম ট্যাগের নামে বন্দী রদবদল এবং এটির নেতিবাচক চেহারা এবং চূড়ান্ত ট্যাগের পিছনে উল্লেখের মাধ্যমেও একত্রিত হতে পারে।
এই ইউআরএলে নিয়মিত প্রকাশের পদ্ধতিটি চেষ্টা করুন : 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);
}
ট্যাগগুলি সরাতে এই পদ্ধতিটি ব্যবহার করুন:
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, ""));
}