এক্সজেএমএল এবং এইচটিএমএলকে একটি রেজেক্সের সাথে পার্স করা কেন শক্ত, তার কয়েকটি উদাহরণ আপনি সরবরাহ করতে পারেন? [বন্ধ]


402

একটি ভুল আমি উপার্জন মানুষ দেখতে বেশি এবং আবার একটি Regex সঙ্গে এক্সএমএল বা 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>

আর কোন গোটাচা আপনি সচেতন?


14
ওয়েব ব্রাউজারগুলি এই ধরণের গণ্ডগোলকে কয়েক সেকেন্ডে কয়েকবার বোঝায়, কেউ কি আমাদের জন্য নিখুঁত নশ্বরদের জন্য কোনও ওয়েব পৃষ্ঠার পার্সার ক্লাস তৈরি করতে পারে না?
জন উইনস্টলি

24
জোন, তারা আছে। পার্লে অনেকগুলি এইচটিএমএল :: পার্সার, এইচটিএমএল :: ট্রিবিল্ডার ইত্যাদি রয়েছে আপনার ল্যাংজের জন্য অবশ্যই একটি রয়েছে।
চস ওয়েন্স

12
সেরা উত্তর হল, stackoverflow.com/a/1732454/135078 (সাবধান Zalgo)
কেলি এস ফরাসি

3
কেন আপনি [এক্স] HTML কে রেজেক্সের সাথে পার্স করতে পারবেন না তার একটি ভাল ব্যাখ্যা রয়েছে [1] [1]: স্ট্যাকওভারফ্লো.com
পাভেল পি

4
আপনি নিখুঁতভাবে কীভাবে এইচটিএমএলকে পার্স করতে পারেন তার পাশাপাশি এখানে সম্ভবত আপনি কেন এটি করতে চান না তার একটি ভাল ব্যাখ্যা এখানে ।
tchrist

উত্তর:


260

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

<!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>

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

তার বিপরীতে শুভকামনা পিট রেগেক্স!

সম্পাদনা (জার্গ ডব্লু মিতাগ): এখানে সু-গঠিত, বৈধ এইচটিএমএল ৪.০১ এর আরও একটি সুন্দর অংশ রয়েছে:

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

6
এক্সএমএল এক? সেখানে কয়েকটি আলাদা কনস্ট্রাকশন রয়েছে, যা ঝামেলাজনক? ডিটিডি ইন্টারনাল সাবসেট? এটি একটি নতুন & সত্তাকে সংজ্ঞায়িত করছে; 'y' নামে পরিচিত, এতে একটি ']>' ক্রম রয়েছে যা সাধারণত, উদ্ধৃতিতে না থাকলে অভ্যন্তরীণ উপসেটটি শেষ করে।
ববিনস

16
(এটি প্রমাণ করে যে কোনও ডকুমেন্ট সঠিকভাবে পার্স করতে এক্সএমএল এর আরও কিছু
গৌরবময় এবং প্রত্নতাত্ত্বিক

17
এইচটিএমএল উদাহরণগুলি খুব কম পরিচিত বৈশিষ্ট্যটি ব্যবহার করে: শর্টট্যাগগুলি। W3.org/QA/2007/10/shorttags.html
নেটভোপ

25
টিম বার্নার্স-লি উপরে যেভাবে এইচটিএমএল লিখেছেন ততবারই একটি টিয়ার ছিঁড়ে যায়।
fgysin মনিকা পুনঃস্থাপন

5
আমি পছন্দ করি কীভাবে স্ট্যাকওভারফ্লোয়ের সিন্ট্যাক্স হাইলাইটার "]" এর 1 ম ইভেন্টে ব্যর্থ হয়।
গ্লাসগোস্ট

71

প্রকৃতপক্ষে

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

বৈধ এইচটিএমএল নয়, এবং এটি বৈধ এক্সএমএলও নয়।

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

এটি বৈধ এইচটিএমএল নয় কারণ সংক্ষিপ্ত সমাপ্তি ফর্মটি এইচটিএমএলে অনুমোদিত নয় (তবে এটি এক্সএমএল এবং এক্সএইচটিএমএলে সঠিক)। 'আইএমজি' ট্যাগটি এইচটিএমএল ৫.০১ স্পেসিফিকেশন অনুসারে একটি স্পষ্টতই বদ্ধ ট্যাগ। এর অর্থ হ'ল ম্যানুয়ালি এটি বন্ধ করা আসলে ভুল এবং অন্য যে কোনও ট্যাগ দু'বার বন্ধ করার সমতুল্য।

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

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

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

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

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

<
tag
attr="5"
/>

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

<tag
attr="5"
/>

এবং এখানে আরও একটি ফানকিয়ার রয়েছে: আপনি প্রকৃতপক্ষে "বা 'আপনার অ্যাট্রিবিউট উদ্ধৃতি চরিত্র হিসাবে ব্যবহার করতে বেছে নিতে পারেন

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

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

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

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

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

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


8
যদিও আপনাকে> যেমন> পালাতে হবে না।
জোয়

8
ঠিক আছে, s / বৈধ / ওয়াইল্ড / জি
চসে

1
আসলে, স্পেসিফিকেশন অনুযায়ী আপনাকে পালাতে হবে> যেমন> আপনাকে অবশ্যই যেমন পালাতে হবে <হিসাবে <& <& & amp; এবং "& quot; এবং & apos হিসাবে হিসাবে বৈশিষ্ট্যগুলিতে; এটি কেবলমাত্র বহু পার্সার
লর্ডঅফ দ্য পিপস

19
স্পেসিফিকেশনটি বলে না যে '>' অবশ্যই পালাতে হবে - অনুক্রমের বিশেষ ক্ষেত্রেটি ছাড়া]]]> 'বিষয়বস্তুতে। এই কারণে সর্বদা '>' রক্ষা পাওয়া সহজ, তবে অনুমানের দ্বারা এটি প্রয়োজন হয় না।
বোবিনস

8
>সাইন ইন এইচটিএমএল পুরোপুরি বৈধ stackoverflow.com/questions/94528/...
JFS

56

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

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

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


20

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


আহ, হ্যাঁ, এটাই ছিল এমন প্রশ্ন যা আমাকে এই প্রথম প্রশ্নটি জিজ্ঞাসা করেছিল (প্রথম লিঙ্ক)।
চস ওয়েন্স

16

এটি "পার্সিং" দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে। সাধারণভাবে বলতে গেলে এক্সএমএলকে রেজিেক্স ব্যবহার করে পার্স করা যায় না কারণ এক্সএমএল ব্যাকরণ কোনওভাবেই নিয়মিত হয় না। এটি সহজভাবে বলতে গেলে, রেজেক্সেস গণনা করতে পারে না (ভাল, পার্ল রেজেক্সগুলি আসলে জিনিস গণনা করতে সক্ষম হতে পারে) যাতে আপনি খোলার ক্লোজড ট্যাগগুলিকে ভারসাম্য রাখতে না পারেন।


আমার ধারণা ব্যাকরিফারেন্সগুলি ওপেন এবং ক্লোজ ট্যাগগুলির সমস্যা সমাধান করতে পারে
রিশুল মট্টা

1
@ রিশুলমত্ত: কেমন? আপনার কেবলমাত্র সীমিত সংখ্যক ব্যাকরফারেন্স রয়েছে এবং নোট করুন যে আপনাকে ট্যাগগুলি বিপরীত করতে হবে ... তদুপরি রেজিক্সগুলির কঠোর সংজ্ঞা ব্যাকরফারেন্সগুলিকে অনুমতি দেয় না।
উইলেম ভ্যান অনসেম

.NET আপনাকে ভারসাম্যযুক্ত এক্সপ্রেশনগুলির জন্য মঞ্জুরি দেয়, যা পপ এবং ধাক্কা দেয় এবং তাত্ত্বিকভাবে স্তরক্রমের সাথে মিলে যাওয়ার জন্য ব্যবহৃত হতে পারে। তবে এটি এখনও একটি খারাপ ধারণা।
আবেল

9

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

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

তবে, আপনার প্রয়োজনীয়তা যদি এইচটিএমএল / এক্সএমএলকে বিশ্লেষণ না করে কেবল এইচটিএমএল / এক্সএমএল এর "জ্ঞাত ভাল" বিটটিতে একটি সামান্য বিট পেতে হয় তবে একটি নিয়মিত প্রকাশ বা এমনকি একটি সরল "স্ট্রিং "ও যথেষ্ট ভাল।


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

1
ঠিক আছে, "যথেষ্ট ভাল" সংজ্ঞা দিন। বলি আমার কাছে একটি ওয়েবপৃষ্ঠা রয়েছে যা আমাকে ক্লায়েন্টের আইপি ঠিকানাটি বলে tells এটিই তাই করে। এখন, আমাকে ক্লায়েন্ট মেশিনের জন্য একটি অ্যাপ্লিকেশন লিখতে হবে যা আমাকে এর আইপি ঠিকানাটি বলে। আমি সেই সাইটে যাই, একটি আইপি অ্যাড্রেস খুঁজছি এবং এটি ফেরত দেব। এইচটিএমএল পার্সিংয়ের দরকার নেই!
রবিন ডে

2
আপনার যদি একটি স্বেচ্ছাচারিত স্ট্রিং থাকে যার ফর্ম্যাটটি সম্পূর্ণরূপে আপনার নিয়ন্ত্রণে থাকে তবে স্ট্রিংটি সুগঠিত এক্সএমএল হওয়ার ঘটনাটি সত্যই প্রাসঙ্গিক নয়। তবে এক্সএমএল-এর প্রায় কোনও ব্যবহারের ঘটনাটি এই বিভাগে আসে।
রবার্ট রসনি

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

@ রবার্ট: "প্রায় কোনও ব্যবহারের ঘটনা নেই" এটি অত্যুক্তি is আমার অভিজ্ঞতায় প্রচলিত পর্যাপ্ত ব্যবহারের কেস রয়েছে। YAGNI এখানে প্রয়োগ হয় ... কখনও কখনও। কৌশলটি আপনি জেনে গেছেন যে বুলেটপ্রুফ এবং দীর্ঘায়ু আপনার সমাধান হওয়া দরকার, আপনি যে নির্দিষ্ট কাজটির সাথে সম্বোধন করছেন for রবিন একটি ভাল পয়েন্ট আছে। তিনি কেবল এটিই বলছেন যে সম্পূর্ণ এক্সএমএল পার্সিং সর্বদা এটির পক্ষে উপযুক্ত নয় ... এটি কীভাবে ব্যবহার করতে হয় তা জানলেও সত্য if
লার্শ

6

লোভীরা সাধারণত লোভী নিদর্শনগুলি লেখার জন্য ডিফল্ট হন, প্রায়শই যথেষ্ট একটি অ-চিন্তা-ভাবনার মধ্য দিয়ে যায় * * ফাইলের বৃহত অংশগুলিকে সর্বাধিক সম্ভাব্য <foo> *


2
পুনরাবৃত্তিটি অলস করার পাশাপাশি .*?<আপনি কোনও অবহেলিত চরিত্র শ্রেণীর মতো ব্যবহার করে এটি ঠিক করতে পারেন [^<]*<। (অস্বীকৃতি: স্পষ্টতই এটি এখনও নির্বোধ নয়, যা প্রশ্নের মূল বিষয়))
ররি ও'কেনে

6

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

সম্ভবত সঠিক ক্লিচ শুরু হয় "যখন আপনার সমস্ত কিছু হাতুড়ি ..." আপনি কীভাবে নিয়মিত এক্সপ্রেশন ব্যবহার করতে জানেন, নিয়মিত এক্সপ্রেশন পার্সিংয়ে ভাল হয়, তবে কেন এক্সএমএল পার্সিং লাইব্রেরি শিখতে বিরক্ত করবেন?

কারণ এক্সএমএলকে পার্সিং করা শক্ত । এক্সএমএল পার্সিং লাইব্রেরিটি ব্যবহার শিখতে না পেরে আপনি যে কোনও প্রচেষ্টা বাঁচাতে পারেন সে পরিমাণ সৃজনশীল কাজ এবং বাগ-স্যাটিংয়ের পরিমাণের চেয়ে বেশি হবে। আপনার নিজের স্বার্থে, গুগল "এক্সএমএল লাইব্রেরি" এবং অন্য কারোর কাজটি লাভ করুন।


3
যদিও এটি সি ++ এর মতো জটিল নয়।
কোল জনসন

6
@ কোল "কোল 9" জনসন আমি সি ++ পার্স করার জন্য আরইএস ব্যবহার করব না।
আইজাক রবিনোভিচ

2
এক্সএমএল যদি সিনক্রোট্রন হয় তবে সি ++ লার্জ হ্যাড্রন কলাইডার হবে।
কেভিন কোস্টলান

4

আমি বিশ্বাস করি যে এই ক্লাসিকটিতে আপনার সন্ধান করা তথ্য রয়েছে। আপনি সেখানে যে কোনও একটি মন্তব্যে পয়েন্টটি খুঁজে পেতে পারেন:

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

চমস্কি হায়ারার্কি থেকে উইকিপিডিয়া থেকে আরও কিছু তথ্য


6
"নিয়মিত অভিব্যক্তি" এর এখানে যেমন আছে তেমন আনুষ্ঠানিক ব্যাকরণ আলোচনায় ঠিক একই অর্থ হয় না। চমত্কার টাইপ 3 গ্রামার (যেমন উদার লোভী ম্যাচিং, ব্যাকরেফ) এর চেয়ে বেশিরভাগ বিদ্যমান রেজেক্স ইঞ্জিনগুলি আরও শক্তিশালী। কিছু রিজেক্স ইঞ্জিন (যেমন পার্ল এর) টিউরিং সম্পূর্ণ। এটি সত্য যে এমনকি এগুলি এইচটিএমএলকে বিশ্লেষণ করার জন্য দুর্বল সরঞ্জাম, তবে এই-উচ্চারণের কারণটি কারণ নয়।
dubiousjim

4

আমি মনে করি সমস্যাগুলি এ পর্যন্ত ফুটে উঠেছে:

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

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

  3. যদি রেজেক্স 99.99% কেস কভার করার জন্য যথাযথভাবে সঠিক হয় তবে এটি পুরোপুরি অপঠনযোগ্য এবং অবিস্মরণীয় হতে চলেছে।

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


1

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

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

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


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

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

1

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

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