আমি সম্মত হই যে এক্সএমএল এবং বিশেষত এইচটিএমএলকে বিশ্লেষণ করার সঠিক সরঞ্জামটি একটি নিয়মিত অভিব্যক্তি ইঞ্জিন নয় পার্সার। তবে অন্যরা যেমন উল্লেখ করেছেন যে, কখনও কখনও একটি রেজেেক্স ব্যবহার করা দ্রুত, সহজ এবং আপনি যদি ডেটা ফর্ম্যাটটি জানেন তবে কাজটি সম্পন্ন করে।
মাইক্রোসফ্টের কাছে .NET ফ্রেমওয়ার্কে নিয়মিত প্রকাশের জন্য সেরা অনুশীলনের একটি বিভাগ রয়েছে এবং ইনপুট উত্সটি বিবেচনা করার বিষয়ে [ইঙ্গিত] সম্পর্কে বিশেষভাবে কথা বলে ।
নিয়মিত এক্সপ্রেশনগুলির সীমাবদ্ধতা রয়েছে তবে আপনি কি নিম্নলিখিতগুলি বিবেচনা করেছেন?
.NET ফ্রেমওয়ার্কটি যখন ব্যালেন্সিং গ্রুপ সংজ্ঞাগুলিকে সমর্থন করে তা নিয়মিত প্রকাশের ক্ষেত্রে আসে ।
এই কারণে, আমি বিশ্বাস করি আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করে XML পার্স করতে পারেন। তবে নোট করুন, এটি অবশ্যই বৈধ এক্সএমএল হওয়া উচিত ( ব্রাউজারগুলি এইচটিএমএলকে খুব ক্ষমা করে দেয় এবং এইচটিএমএলের ভিতরে খারাপ এক্সএমএল সিনট্যাক্সের অনুমতি দেয় ) এটি সম্ভব হয়েছে যেহেতু "ব্যালেন্সিং গ্রুপ সংজ্ঞা" নিয়মিত এক্সপ্রেশন ইঞ্জিনকে পিডিএ হিসাবে কাজ করার অনুমতি দেবে।
উপরে নিবন্ধ 1 নিবন্ধ থেকে উদ্ধৃতি:
.NET নিয়মিত এক্সপ্রেশন ইঞ্জিন
উপরে বর্ণিত হিসাবে সঠিকভাবে সুষম কনস্ট্রাক্টগুলি নিয়মিত অভিব্যক্তি দ্বারা বর্ণনা করা যায় না। যাইহোক, .NET নিয়মিত এক্সপ্রেশন ইঞ্জিনটি কয়েকটি কনস্ট্রাক্ট সরবরাহ করে যা সুষম কনস্ট্রাক্টগুলি স্বীকৃতি দেয়।
(?<group>)
- নাম গোষ্ঠীর সাথে ক্যাপচার স্ট্যাকের ক্যাপচারিত ফলাফলটিকে ধাক্কা দেয়।
(?<-group>)
- ক্যাপচার স্ট্যাক বন্ধ নাম গ্রুপের সাথে শীর্ষ সর্বাধিক ক্যাপচার পপ।
(?(group)yes|no)
- হ্যাঁ অংশের সাথে মেলে যদি নাম গোষ্ঠীর সাথে একটি গ্রুপ থাকে অন্যথায় কোনও অংশ মেলে না।
এই গঠনগুলি একটি। নেট নিয়মিত প্রকাশের জন্য স্ট্যাক অপারেশনের সাধারণ সংস্করণগুলি প্রয়োজনীয়ভাবে অনুমতি দেয়: পুশ, পপ এবং খালি a সাধারণ ক্রিয়াকলাপগুলি যথাযথভাবে ইনক্রিমেন্ট, হ্রাস এবং তুলনামূলকভাবে শূন্যের সাথে তুলনা করে। এটি .NET নিয়মিত এক্সপ্রেশন ইঞ্জিনকে প্রসঙ্গ-মুক্ত ভাষার একটি উপসেট সনাক্ত করতে সহায়তা করে, বিশেষত যেগুলি কেবল একটি সাধারণ কাউন্টারের প্রয়োজন। এটি পরিবর্তে অ-প্রথাগত। নেট নিয়মিত প্রকাশের জন্য স্বতন্ত্রভাবে সুষম কাঠামো সনাক্ত করতে দেয়।
নিম্নলিখিত নিয়মিত প্রকাশটি বিবেচনা করুন:
(?=<ul\s+id="matchMe"\s+type="square"\s*>)
(?>
<!-- .*? --> |
<[^>]*/> |
(?<opentag><(?!/)[^>]*[^/]>) |
(?<-opentag></[^>]*[^/]>) |
[^<>]*
)*
(?(opentag)(?!))
পতাকা ব্যবহার করুন:
- সপ্তাহের দিন
- প্যাটার্নওয়াইটস স্পেস উপেক্ষা করুন (আপনি যদি রেজেক্স ভেঙে পড়ে এবং সমস্ত সাদা স্থান সরিয়ে ফেলেন তবে প্রয়োজনীয় নয়)
- উপেক্ষা করুন (প্রয়োজনীয় নয়)
নিয়মিত এক্সপ্রেশন ব্যাখ্যা (ইনলাইন)
(?=<ul\s+id="matchMe"\s+type="square"\s*>) # match start with <ul id="matchMe"...
(?> # atomic group / don't backtrack (faster)
<!-- .*? --> | # match xml / html comment
<[^>]*/> | # self closing tag
(?<opentag><(?!/)[^>]*[^/]>) | # push opening xml tag
(?<-opentag></[^>]*[^/]>) | # pop closing xml tag
[^<>]* # something between tags
)* # match as many xml tags as possible
(?(opentag)(?!)) # ensure no 'opentag' groups are on stack
আপনি এটি আরও ভাল। নেট নিয়মিত এক্সপ্রেশন পরীক্ষক এ চেষ্টা করতে পারেন ।
আমি এর নমুনা উত্স ব্যবহার করেছি:
<html>
<body>
<div>
<br />
<ul id="matchMe" type="square">
<li>stuff...</li>
<li>more stuff</li>
<li>
<div>
<span>still more</span>
<ul>
<li>Another >ul<, oh my!</li>
<li>...</li>
</ul>
</div>
</li>
</ul>
</div>
</body>
</html>
এটি মিল খুঁজে পেয়েছে:
<ul id="matchMe" type="square">
<li>stuff...</li>
<li>more stuff</li>
<li>
<div>
<span>still more</span>
<ul>
<li>Another >ul<, oh my!</li>
<li>...</li>
</ul>
</div>
</li>
</ul>
যদিও এটি প্রকৃতপক্ষে এভাবে প্রকাশিত হয়েছিল:
<ul id="matchMe" type="square"> <li>stuff...</li> <li>more stuff</li> <li> <div> <span>still more</span> <ul> <li>Another >ul<, oh my!</li> <li>...</li> </ul> </div> </li> </ul>
শেষ অবধি, আমি সত্যিই জেফ আতউডের নিবন্ধটি উপভোগ করেছি: এইচটিএমএল দ্য চথুলহু ওয়ে পার্সিং । যথেষ্ট মজার বিষয়, এটি এই প্রশ্নের উত্তরের উদ্ধৃতি দেয় যেখানে বর্তমানে 4k এর বেশি ভোট রয়েছে।