এইচটিএমএল পার্সগুলি কীভাবে কাজ করবে যদি তারা রেজিপ্যাক্স ব্যবহার না করে?


96

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

এটি আমার জন্য বরং বিভ্রান্তিকর, আমি সর্বদা ভেবেছিলাম যে সাধারণভাবে, কোনও জটিল স্ট্রিংকে বিশ্লেষণ করার সর্বোত্তম উপায় হ'ল নিয়মিত ভাব প্রকাশ করা। সুতরাং কিভাবে একটি HTML পার্সার কাজ করে? এটি পার্স করার জন্য নিয়মিত এক্সপ্রেশন ব্যবহার করে না?

নিয়মিত এক্সপ্রেশন ব্যবহারের জন্য একটি বিশেষ যুক্তি হ'ল সর্বদা পার্সিং বিকল্প নেই (যেমন জাভাস্ক্রিপ্ট, যেখানে ডমডকুমেন্ট সর্বজনীন উপলভ্য বিকল্প নয়)। উদাহরণস্বরূপ, jQuery একটি HTML স্ট্রিংকে DOM নোডগুলিতে রূপান্তর করতে একটি রেইজেক্স ব্যবহার করে ঠিকঠাক পরিচালনা করে।

এটি সিডব্লিউকে দেবে কি না তা নিশ্চিত নয়, এটি একটি আসল প্রশ্ন যা আমি উত্তর দিতে চাই এবং সত্যই আলোচনার থ্রেড হওয়ার উদ্দেশ্যে নয়।


পার্সিং এবং এইচটিএমএল-পার্সিং যুক্ত করতে পশ্চাদপসরণ করা হয়েছে - @ অ্যান্ডি ই, আমি আশা করি আপনার সাথে এটি ঠিক আছে - আমি ভেবেছিলাম এটি সহায়ক হবে।
জেএক্সজি

@ জেএক্সজি: আমার সাথে এটি ঠিক আছে, ধন্যবাদ :-)
অ্যান্ডি ই

উত্তর:


65

সাধারণত টোকেনিসার ব্যবহার করে। খসড়া এইচটিএমএল 5 স্পেসিফিকেশনটিতে "রিয়েল ওয়ার্ল্ড এইচটিএমএল" পরিচালনা করার জন্য একটি বিস্তৃত অ্যালগরিদম রয়েছে


4
ভাল সন্ধান ... উদ্ধৃতি দেওয়ার জন্য "এই কেসগুলি পরিচালনা করতে পার্সারদের কাছে একটি স্ক্রিপ্ট নেস্টিং স্তর রয়েছে যা প্রাথমিকভাবে শূন্যতে সেট করা আবশ্যক, এবং একটি পার্সার বিরতি পতাকা, যা প্রাথমিকভাবে মিথ্যাতে সেট করা উচিত" " - অন্য কথায়, আপনাকে এটি নিজেই পুনরাবৃত্তি করতে হবে এবং প্রচুর কাস্টম যুক্তি থাকতে হবে: পি
টিমোথি খৌরি

4
উপনোট। কিছু প্রযুক্তির পরিবর্তে অ্যালগরিদমিক জটিলতায় জোর দেওয়া ভাল।
আরনিস ল্যাপসা

4
প্রচুর কাস্টম যুক্তি দিয়ে এটিকে নিজেকে বিভক্ত করা এমন দুর্দান্ত ধারণা নয়। আপনি যদি পারেন তবে স্ট্যান্ডার্ড অ্যালগরিদম সমর্থন করে এমন একটি লাইব্রেরি ব্যবহার করুন। যেমন search.cpan.org/~tobyink/HTML-HTML5-Parser-0.03/lib/HTML/HTML5/... / code.google.com/p/html5lib
কোয়েন্টিন

8
এইচটিএমএল পার্সারগুলির সাথে প্রাথমিক সমস্যাটি হ'ল কোনও ত্রুটির মুখোমুখি হওয়ার পরে, আপনি "পার্স ত্রুটি" ছুঁকতে এবং এটি ছেড়ে দেওয়া ঠিক করবেন না। আপনি কুইর্কস মোডে প্রবেশ করেছেন এবং মেলানো ট্যাগ, [{]} স্টাইল ইন্টারলেস এবং সমস্ত ধরণের অদ্ভুততা সহ আপনার যে গণ্ডগোলের মুখোমুখি হয়েছেন তার থেকে সেরাটি তৈরি করার চেষ্টা করুন, ফলাফলটি যতটা সম্ভব ততই সুন্দর দেখাবার চেষ্টা করছেন এবং অনিবার্য ব্যর্থতা সর্বনিম্ন বেদনাদায়ক ... এটি এমন কিছু নয় যা আপনি রেজিজেস দিয়ে করতে পারেন।
এসএফ

7
@ টিমোথি কে: 'দ্রষ্টব্য: যেহেতু এই অ্যালগরিদমের ফলে উপাদানগুলি পিতামাতার পরিবর্তিত হয়, তাই এটি "অ্যাডাপ্টেশন এজেন্সি অ্যালগরিদম" নামে অভিহিত করা হয়েছে (অপ্রত্যাশিত বিষয়বস্তু নিয়ে কাজ করার জন্য অন্যান্য সম্ভাব্য অ্যালগরিদমের বিপরীতে, "ইনসেস্ট অ্যালগরিদম" অন্তর্ভুক্ত করে, "সিক্রেট অ্যাফেয়ার অ্যালগরিদম", এবং "হাইজেনবার্গ অ্যালগরিদম") '
জেএক্সজি

133

সুতরাং কিভাবে একটি HTML পার্সার কাজ করে? পার্স করার জন্য এটি কি নিয়মিত ভাব প্রকাশ করে না?

ভাল, না।

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

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

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

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

আচ্ছা, এটি কি এইচটিএমএল-এর পক্ষে যথেষ্ট? দুঃখের বিষয়, না। সুপার-ডুপারের জন্য সাবধানতার সাথে এক্সএমএল যাচাই করা হয়েছে, যার মধ্যে সমস্ত ট্যাগ সর্বদা নিখুঁতভাবে থাকে। রিয়েল-ওয়ার্ল্ড এইচটিএমএলে, আপনি সহজেই স্নিপেটগুলি পছন্দ করতে পারেন <b><i>wow!</b></i>। এটি অবশ্যই বাসা বাঁধে না, সুতরাং এটি সঠিকভাবে পার্স করার জন্য, একটি স্ট্যাক কেবল যথেষ্ট শক্তিশালী নয়।

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

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

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


22

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

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


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

6

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


2

আপনি যদি 100% সমাধান পেতে চান: আপনার নিজের কাস্টম কোডটি লিখতে হবে যা এইচটিএমএল চরিত্রের বাইরের চরিত্রের মাধ্যমে পুনরাবৃত্তি হয় এবং আপনার বর্তমান নোডটি বন্ধ করে শুরু করতে হবে কিনা তা নির্ধারণ করার জন্য আপনার প্রচুর পরিমাণে যুক্তি থাকতে হবে পরবর্তী.

কারণটি হ'ল এটি বৈধ এইচটিএমএল:

<ul>
<li>One
<li>Two
<li>Three
</ul>

তবে এটি হ'ল:

<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>

আপনি যদি "90% সমাধান" দিয়ে ঠিক থাকেন: তবে কোনও ডকুমেন্ট লোড করার জন্য এক্সএমএল পার্সার ব্যবহার করা ভাল। বা রেজেক্স ব্যবহার করা (যদিও আপনি যদি সামগ্রীতে মাস্টার হন তবে এক্সএমএল সহজ)।


4
একটি এক্সএমএল পার্সার আরও 1% সমাধানের মতো। এইচটিএমএল ডকুমেন্টগুলির সংখ্যা যেগুলি ভালভাবে এক্সএমএল গঠিত হয় তা ক্ষুদ্র।
কোয়ান্টিন

4
হ্যাঁ, তারা করে ... আপনি অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে নেবেন না things তবে আমার বক্তব্যটি আপনাকে নিজের পার্সার লিখতে হবে। নতুন-বয়সের প্রোগ্রামাররা এ জাতীয় কোড লেখার জন্য অভ্যস্ত নয় ... আমরা "এইচটিএমএল ডকুমেন্ট ইউটিলিটি.লড" এবং এর মতো স্টাফ ব্যবহার করতাম :)
টিমোথি খৌরি

4
@ অ্যান্ডি ই: রেজেক্সগুলি যাদু নয়, এগুলি পার্সিং বা হেকের মতো অন্য কোনও স্ট্রিং ফাংশনের মতোই চরিত্র অনুসারে কাজ করে।
বার্ট ভ্যান হিউকেলোম

4
বিটিডাব্লু: আপনার প্রথম উদাহরণটি কেবল "আধা-বৈধ এইচটিএমএল" নয়। এটি প্রকৃতপক্ষে বৈধ এইচটিএমএল 4.01 কঠোর। এটি যাচাই করতে আপনি ডাব্লু 3 সি বৈধকারক ব্যবহার করতে পারেন। সমাপনী ট্যাগটি <li> (এইচটিএমএল 4 স্পেস দেখুন) এর জন্য আনুষ্ঠানিকভাবে optionচ্ছিক।
sleske

4
@ বার্ট: ভাল কথা, কখনও কখনও আমার মস্তিষ্ক সমস্ত যুক্তি ভুলে যায় এবং মনে করে যে জিনিসগুলি যাদু দ্বারা কাজ করে।
অ্যান্ডি ই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.