html - যবহ - আপনি XML এবং এইচটিএমএল একটি regex সঙ্গে parse কঠিন কেন কিছু উদাহরণ দিতে পারেন?




html ভাষা (8)

সাধারণভাবে বলা যায়, এক্সএমএল ব্যাকরণটি রেজেক্স ব্যবহার করে পার্স করা যাবে না কারণ এক্সএমএল ব্যাকরণ নিয়মিত নয়। এটি সহজভাবে রাখতে, regexes গণনা করতে পারে না (ভাল, পার্ল Regexes আসলে জিনিস গণনা করতে সক্ষম হতে পারে) যাতে আপনি খোলা বন্ধ ট্যাগ সামঞ্জস্য করতে পারবেন না।

আমি অসম্মতি। আপনি regex মধ্যে recursive ব্যবহার করতে হবে, আপনি সহজেই খোলা এবং বন্ধ ট্যাগ খুঁজে পেতে পারেন।

Here প্রথম বার্তাটিতে উদাহরণগুলির ত্রুটি বিশ্লেষণ এড়াতে আমি রেজেক্সের উদাহরণ দেখিয়েছি।

এক ভুল আমি দেখেছি যে বার বার মানুষ তৈরি করছে এক্সএলএম বা এইচটিএমএলকে রেজেক্স দিয়ে পার্স করার চেষ্টা করছে। এক্সএমএল প্যারিসিংয়ের কয়েকটি কারণ এখানে এবং HTML টি কঠিন:

লোকেরা লাইনের ক্রম হিসাবে একটি ফাইলকে চিকিত্সা করতে চায়, তবে এটি বৈধ:

<tag
attr="5"
/>

লোকেরা <বা <ট্যাগের ট্যাগ হিসাবে ট্যাগ করতে চায়, কিন্তু এটির মত জিনিসটি বন্যদের মধ্যে বিদ্যমান:

<img src="imgtag.gif" alt="<img>" />

লোকেরা ট্যাগগুলি শেষ করার জন্য শুরু হওয়া ট্যাগগুলির সাথে মিলতে চায় তবে এক্সএমএল এবং এইচটিএমএল ট্যাগগুলিকে নিজেদেরকে ধারণ করতে দেয় (কোন ঐতিহ্যগত রেজেক্সগুলি এগুলি পরিচালনা করতে পারে না):

<span id="outer"><span id="inner">foo</span></span> 

লোকেরা প্রায়ই একটি দস্তাবেজের সামগ্রীর (যেমন "প্রদত্ত পৃষ্ঠায় সমস্ত ফোন নম্বর খুঁজে বের করুন" সমস্যা) বিরুদ্ধে মিলতে চায় তবে ডেটা চিহ্নিত করা যেতে পারে (এমনকি দেখা গেলে এটি স্বাভাবিক বলে মনে হয়):

<span class="phonenum">(<span class="area code">703</span>)
<span class="prefix">348</span>-<span class="linenum">3020</span></span>

মন্তব্যগুলি দুর্বল ফর্ম্যাট বা অসম্পূর্ণ ট্যাগ থাকতে পারে:

<a href="foo">foo</a>
<!-- FIXME:
    <a href="
-->
<a href="bar">bar</a>

আপনি কি সচেতন আছেন?


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


আমি here এই সমস্যার একটি সরলীকৃত উত্তর দিয়েছেন। যদিও এটি 100% চিহ্নের জন্য হিসাব করে না, তবে আপনি কীভাবে প্রাক প্রক্রিয়াকরণ কাজ করতে ইচ্ছুক তা কীভাবে সম্ভব তা ব্যাখ্যা করে।


আমি এই বিষয়ে একটি সম্পূর্ণ ব্লগ এন্ট্রি লিখেছি: নিয়মিত এক্সপ্রেশন সীমাবদ্ধতা

ইস্যুটির ক্রুক্স হ'ল এইচটিএমএল এবং এক্সএমএল পুনর্মিলনী কাঠামো যা যথাযথভাবে বিশ্লেষণ করার জন্য গণনা গণনা প্রয়োজন। একটি সত্য regex গণনা করতে সক্ষম হয় না। আপনি গণনা করার জন্য একটি প্রসঙ্গ বিনামূল্যে ব্যাকরণ থাকতে হবে।

আগের অনুচ্ছেদ একটি সামান্য caveat সঙ্গে আসে। কিছু regex বাস্তবায়ন এখন recursion ধারণা সমর্থন করে। তবে একবার আপনি আপনার রেজেক্স এক্সপ্রেশনগুলিতে পুনরাবৃত্তি যুক্ত করতে শুরু করলে, আপনি সত্যিই সীমানাগুলি প্রসারিত করছেন এবং একটি পসারের বিবেচনা করা উচিত।


আমি মনে করি সমস্যাগুলি উড়ে যায়:

  1. Regex প্রায় অচেনা ভুল। বৈধ ইনপুট আছে যা সঠিকভাবে মিলতে ব্যর্থ হবে। যদি আপনি যথেষ্ট পরিমাণে কাজ করেন তবে আপনি এটি 99% সঠিক বা 99.999% তৈরি করতে পারেন তবে এটি 100% সঠিক করে তুলতে প্রায় অসম্ভব, যদি শুধুমাত্র অদ্ভুত জিনিসের কারণে এক্সএমএলগুলি ব্যবহার করে XML অনুমতি দেয়।

  2. যদি Regex ভুল হয়, এমনকি 0.00001% ইনপুটগুলির জন্যও, আপনার কাছে একটি নিরাপত্তা সমস্যা রয়েছে, কারন কেউ এমন একটি ইনপুট আবিষ্কার করতে পারে যা আপনার অ্যাপ্লিকেশনটি ভাঙ্গবে।

  3. যদি রেজেক্স 99.99% ক্ষেত্রে কভার করার জন্য যথেষ্ট সঠিক হয় তবে এটি পুঙ্খানুপুঙ্খভাবে অপঠনীয় এবং অচেনা হবে।

  4. মাঝারি আকারের ইনপুট ফাইলগুলিতে একটি রেজেক্স খুব খারাপভাবে সঞ্চালিত হওয়ার সম্ভাবনা খুব বেশি। এক্সএমএলটির সাথে আমার প্রথম মুখোমুখি একটি পার্ল স্ক্রিপ্ট প্রতিস্থাপন করা ছিল যা ভুল XML পসারের সাথে (ভুলভাবে) ইনকামিং এক্সএমএল ডকুমেন্টগুলিকে বিশ্লেষণ করে এবং আমরা কেবল 100 টি লাইন সহ অপঠনীয় কোডের 300 লাইন প্রতিস্থাপিত করিনি যেটি কেউ বুঝতে পারে, কিন্তু আমরা ব্যবহারকারী প্রতিক্রিয়া সময় উন্নত করেছি 10 সেকেন্ড থেকে 0.1 সেকেন্ড পর্যন্ত।


এখানে আপনার জন্য কিছু মজাদার বৈধ XML রয়েছে:

<!DOCTYPE x [ <!ENTITY y "a]>b"> ]>
<x>
    <a b="&y;>" />
    <![CDATA[[a>b <a>b <a]]>
    <?x <a> <!-- <b> ?> c --> d
</x>

এবং আনন্দ এই সামান্য বান্ডিল বৈধ এইচটিএমএল হয়:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" [
    <!ENTITY % e "href='hello'">
    <!ENTITY e "<a %e;>">
]>
    <title>x</TITLE>
</head>
    <p id  =  a:b center>
    <span / hello </span>
    &amp<br left>
    <!---- >t<!---> < -->
    &e link </a>
</body>

অবৈধ গঠনের জন্য সমস্ত ব্রাউজার-নির্দিষ্ট পার্সিং উল্লেখ করা হয় না।

শুভ কামনা যে বিরুদ্ধে regex pitting!

EDIT (জর্গ ডব্লু মিত্যাগ): এখানে আরও ভাল সুন্দর, বৈধ এইচটিএমএল 4.01:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd"> 
<HTML/
  <HEAD/
    <TITLE/>/
    <P/>

প্রকৃতপক্ষে

<img src="imgtag.gif" alt="<img>" />

বৈধ HTML নয়, এবং এটি বৈধ XML নয়।

এটি বৈধ এক্সএমএল নয় কারণ '<' এবং '>' বৈশিষ্ট্য সারির ভিতরে বৈধ অক্ষর নয়। সংশ্লিষ্ট এক্সএমএল সংস্থাগুলি ব্যবহার করে তারা পালিয়ে যেতে হবে & lt; এবং & gt;

এইচটিএমএল এ সংক্ষিপ্ত বন্ধকরণ ফর্ম অনুমোদিত নয় তবে এটি বৈধ এইচটিএমএল নয় (তবে XML এবং XHTML এ সঠিক)। এইচটিএমএল 4.01 স্পেসিফিকেশন অনুযায়ী 'আইএমজি' ট্যাগটি একটি নিখুঁতভাবে বন্ধ হওয়া ট্যাগ। এর অর্থ হল এটি বন্ধ করা আসলে ভুল, এবং এটি অন্য কোন ট্যাগ বন্ধ করার সমতুল্য।

এইচটিএমএল সঠিক সংস্করণ

<img src="imgtag.gif" alt="&lt;img&gt;">

এবং এক্সএইচটিএমএল এবং এক্সএমএল মধ্যে সঠিক সংস্করণ

<img src="imgtag.gif" alt="&lt;img&gt;"/>

আপনি দেওয়া নিম্নলিখিত উদাহরণ এছাড়াও অবৈধ

<
tag
attr="5"
/>

এটি বৈধ এইচটিএমএল বা এক্সএমএল নয়। ট্যাগটির নামটি অবশ্যই <'এর পিছনে থাকা উচিত, যদিও বৈশিষ্ট্যাবলী এবং বন্ধ হওয়া'> 'যেখানেই হোক সেখানেই হতে পারে। সুতরাং বৈধ এক্সএমএল আসলে হয়

<tag
attr="5"
/>

এবং এখানে আরেকটি funkier এক: আপনি আসলে আপনার গুণাবলী উদ্ধৃত অক্ষর হিসাবে "বা" ব্যবহার করতে পারেন

<img src="image.gif" alt='This is single quoted AND valid!'>

পোস্ট করা সমস্ত অন্যান্য কারণ সঠিক, কিন্তু এইচটিএমএল প্যারিসিং সঙ্গে সবচেয়ে বড় সমস্যা হল যে লোকেরা সাধারণত সমস্ত সিনট্যাক্স নিয়ম সঠিকভাবে বুঝতে না। আপনার ব্রাউজারটি এইচটিএমএল হিসাবে আপনার ট্যাগআপকে ব্যাখ্যা করে এমনটি আসলে আপনার বৈধ HTML লেখা নেই।

সম্পাদনা করুন এবং এমনকি .com বৈধ এবং অবৈধ সংজ্ঞা সম্পর্কে আমার সাথে সম্মত। আপনার অবৈধ এক্সএমএল / এইচটিএমএল হাইলাইট করা হয় না, যখন আমার সংশোধন সংস্করণ হয়।

মূলত, এক্সএমএল regexps সঙ্গে পার্স করা করা হয় না। কিন্তু তাই করার কোন কারণ নেই। প্রতিটি ভাষার জন্য অনেকগুলি এক্সএমএল প্যাসার রয়েছে। আপনি SAX পার্সার, DOM পার্সার এবং পল পার্সার মধ্যে পছন্দ আছে। এই সমস্ত regexp দিয়ে পার্সিংয়ের চেয়ে অনেক দ্রুত নিশ্চিত করা হয় এবং আপনি পরবর্তী DOM ট্রিতে এক্সপ্যাথ বা এক্সএসএলটি মত শীতল প্রযুক্তি ব্যবহার করতে পারেন।

তাই আমার উত্তর হল: শুধুমাত্র রেজেক্স্স হার্ড দিয়ে এক্সএমএলটি পার্স করা হয় না, তবে এটিও একটি খারাপ ধারণা। শুধু বিদ্যমান এক্সএমএল প্যাসারের এক লক্ষ ব্যবহার করুন এবং এক্সএমএল এর সকল উন্নত বৈশিষ্ট্যগুলির সুবিধা নিন।

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


মানুষ কি আসলেই একটি রেজেক্স ব্যবহার করে ভুল করছে, নাকি এটি অর্জন করার চেষ্টা করছে কেবল এটির পক্ষে যথেষ্ট ভাল?

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

তবে, যদি আপনার প্রয়োজনটি এইচটিএমএল / এক্সএমএল প্যারিস না করা যায় তবে HTML / xml এর একটি "পরিচিত ভাল" বিটটিতে মাত্র একটি ছোট্ট তথ্য পেতে হলে হয়তো নিয়মিত অভিব্যক্তি বা এমনকি একটি সহজতর "সাবস্ট্রিং" যথেষ্ট ভাল।







regex