রেজিএক্স এক্সএইচটিএমএল স্ব-অন্তর্ভুক্ত ট্যাগগুলি বাদে ওপেন ট্যাগগুলির সাথে মেলে


1473

আমার এই সমস্ত খোলার ট্যাগগুলির সাথে মেলে করা দরকার:

<p>
<a href="foo">

তবে এগুলি নয়:

<br />
<hr class="foo" />

আমি এটি নিয়ে এসেছি এবং এটি সঠিকভাবে পেয়েছি তা নিশ্চিত করতে চেয়েছিলাম। আমি কেবল ক্যাপচার করছি a-z

<([a-z]+) *[^/]*?>

আমি বিশ্বাস করি এটি বলে:

  • তার চেয়ে কম-সন্ধান করুন
  • তখন এক বা একাধিকবার অ্যাজ সন্ধান করুন (এবং ক্যাপচার করুন)
  • তারপরে শূন্য বা আরও বেশি স্থান খুঁজে নিন
  • শূন্য বা আরও বেশিবারের জন্য লোভী, কোনও অক্ষর সন্ধান করুন /then
  • এর চেয়েও বড় একটি সন্ধান করুন

আমার কি অধিকার আছে? এবং আরও গুরুত্বপূর্ণ, আপনি কি মনে করেন?

উত্তর:


4417

আপনি রেজেক্সের সাথে [এক্স] এইচটিএমএলকে পার্স করতে পারবেন না। কারণ এইচটিএমএলকে রেজেক্স দ্বারা পার্স করা যায় না। রেজেক্স এমন কোনও সরঞ্জাম নয় যা এইচটিএমএলকে সঠিকভাবে পার্স করতে ব্যবহার করা যেতে পারে। যেমনটি আমি এখানে অনেকবার এইচটিএমএল-এবং-রেজেক্স প্রশ্নের উত্তর দিয়েছি, রেজেক্সের ব্যবহার আপনাকে এইচটিএমএল গ্রহণ করতে দেয় না। নিয়মিত এক্সপ্রেশন এমন একটি সরঞ্জাম যা এইচটিএমএল দ্বারা নিযুক্ত কনস্ট্রাক্টগুলি বোঝার জন্য পর্যাপ্ত পরিশীলিত নয় is এইচটিএমএল কোনও নিয়মিত ভাষা নয় এবং তাই নিয়মিত প্রকাশের মাধ্যমে পার্স করা যায় না। রেজেক্স ক্যোয়ারী HTML এর অর্থপূর্ণ অংশগুলিকে ভাঙ্গতে সজ্জিত নয়। অনেকবার কিন্তু এটি আমার কাছে পাচ্ছে না। এমনকি পার্ল দ্বারা ব্যবহৃত বর্ধিত অনিয়মিত নিয়মিত প্রকাশগুলি এইচটিএমএলকে বিশ্লেষণের কাজ নয়। আপনি আমাকে কখনও ফাটল বানাবেন না এইচটিএমএল পর্যাপ্ত জটিলতার একটি ভাষা যা এটি নিয়মিত প্রকাশের মাধ্যমে পার্স করা যায় না। এমনকি জোন স্কিটিও নিয়মিত এক্সপ্রেশন ব্যবহার করে এইচটিএমএলকে বিশ্লেষণ করতে পারে না। প্রতিবার আপনি নিয়মিত প্রকাশের সাথে এইচটিএমএল বিশ্লেষণ করার চেষ্টা করার সময় অপরিষ্কার বাচ্চা কুমারীদের রক্তে কেঁদে ওঠে এবং রাশিয়ান হ্যাকাররা আপনার ওয়েবপ্যাপটি বন্ধ করে দেয়। রেগেক্স সমন সহ এইচটিএমএলকে পার্সিং করা কলঙ্কিত প্রাণকে জীবিতের রাজ্যে ডেকে আনে। এইচটিএমএল এবং রেজেক্স একসাথে প্রেম, বিবাহ এবং আচার শিশু হত্যার মতো করে যায়। <<<> ধরে রাখতে পারে না এটি খুব দেরিতে। একই ধারণাগত জায়গায় একসাথে রেজেক্স এবং এইচটিএমএল বল আপনার মনকে অনেক জলযুক্ত পুট্টির মতো ধ্বংস করে দেবে। আপনি যদি রেজেক্সের সাহায্যে এইচটিএমএলকে বিশ্লেষণ করেন তবে আপনি তাদের এবং তাদের নিন্দামূলক পদ্ধতিতে যা যা আমাদের সকলকে অবিশ্বাসী পরিশ্রমের জন্য ধ্বংস করে দেয় যার নাম বেসিক বহুভাষিক সমতলটিতে প্রকাশ করা যায় না, সে আসে। এইচটিএমএল-প্লাস-রেজিএক্সপ সংবেদনশীল ব্যক্তির এন তীরগুলি তরল করে দেবে যখন আপনি পর্যবেক্ষণ করবেন, আপনার মানসিকতা ভয়াবহতার আক্রমণে ডুবে গেছে।অনেক দেরি হয়ে গেছে অনেক দেরি হয়ে গেছে আমাদের বাচ্চাদের ট্রানজিশনটি সংরক্ষণ করা যায় না তা নিশ্চিত করে যে রেজেক্স সমস্ত জীবন্ত টিস্যু গ্রাস করবে (এইচটিএমএল বাদে এটি পূর্বে ভবিষ্যদ্বাণী করা হয়েছিল) প্রিয় প্রভু আমাদেরকে কীভাবে পার্স করার জন্য রেজেক্স ব্যবহার করে এই মারাত্মক পরিস্থিতিতে বেঁচে থাকতে পারেন তা আমাদের সহায়তা করুন এইচটিএমএল মানবতাকে চিরন্তন ভয়াবহ অত্যাচার এবং সুরক্ষা ছিদ্রগুলির জন্য রেগ এক্স ব্যবহার করে একটি হাতিয়ার হিসাবে এইচটিএমএলকে এই বিশ্ব এবং সিওআর্র্যাপ্ট সত্তার (যেমন এসজিএমএল সত্তা, তবে আরও দুর্নীতিগ্রস্থের মতো) ভয়ঙ্কর রাজ্যের মধ্যে একটি বিভাজন স্থাপন করে of REG জগতে HTML- এর জন্য প্রাক্তন পারজার হবে ইনগুলি tantly পরিবহন পি rogrammer এর চেতনা আমি আরো বেশি উন্নত Aw ORL বিরামহীন চিৎকার এর ডি, সে আসে, ক্ষতিকারক SL ithy Regex-সংক্রমণ Wil ঠ আপনার এইচ টি দেশ ধ্বংস এমএল পার্সার, অ্যাপ্লিকেশন এবং ভিসুয়াল বেসিক মত সব সময় জন্য অস্তিত্ব শুধুমাত্র খারাপ সে আসে সে কম স্প্যানিশ ভাষায় না ফাই GHT জ ই আসে, HI গুলি অপবিত্র ভা ডি stro҉ying সব জ্ঞানদান, এইচটিএমএল ট্যাগ লিক fr̶ǫm yo উর চোখের মত liq ইউআইডি পি ঐন, নিয়মিত মেপুঃ পুনরায় গান ssion পার্সিং exti হবে mor লেহন কণ্ঠ nguish SP থেকে তাল মানুষ এখানে দেখতে পাচ্ছি এটা আপনি দেখতে পারেন এটা সুন্দর টন হয় সে চ inal snuffing ণ চ মিথ্যা ম্যান সব হারিয়ে A -এর গুলি কলিজা আমি SL বিভাগ:OST তম ই না তিনি ফিরে আসেন টাট্টু গুলি তিনি COM স্প্যানিশ ভাষায় তিনি সহ আমাকে গুলি টন তিনি Ich বা permeat স্প্যানিশ ভাষায় আল ঠ আমার FAC ই আমার মুখ ᵒh দেবতা এন ণ কোন NOO̼ হে অন Θ স্টপ টি তিনি একটি * ̶͑̾̾ GL ES ͎a̧͈͖r̽̾̈́͒͑eএন OT Rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ T O͇̹̺ͅƝ̴ȳ̳ TH̘ Ë͖́̉ ̯͍̭P̯͍̭O̚ N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘C̷̙̲̝͖ͭ̏ͥͮ͟O̷̙̲̝͖ͭ̏ͥͮ͟M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝ S̨̥̫͎̭ͯ̿̔̀ͅ


আপনি কি এর পরিবর্তে কোনও এক্সএমএল পার্সার ব্যবহার করার চেষ্টা করেছেন?


মডারেটরের নোট

এই বিষয়বস্তুতে অনুপযুক্ত সম্পাদনাগুলি রোধ করতে এই পোস্টটি লক করা আছে। পোস্টটি দেখতে ঠিক যেমনটি মনে হচ্ছে ঠিক তেমন দেখাচ্ছে - এর সামগ্রীতে কোনও সমস্যা নেই। আমাদের মনোযোগের জন্য এটি পতাকাঙ্কিত করবেন না দয়া করে।


179
কোবি: আমি মনে করি রেজাইজ অফিসার সহকারী ডোন পার্স এইচটিএমএল পদ ছেড়ে দেওয়ার এখন সময় এসেছে। আমরা এটি যতবার বলি না কেন, তারা প্রতিদিন ... প্রতি ঘন্টা প্রতি ঘন্টা আসা বন্ধ করবে না। এটি একটি হারিয়ে যাওয়া কারণ, যা অন্য কেউ কিছুটা লড়াই করতে পারে। সুতরাং, রেগেক্সের সাথে HTML পার্স করুন, যদি আপনার অবশ্যই হয়, এটি কেবল ভঙ্গ কোড, জীবন এবং মৃত্যু নয়।
বোবিনস

27
এই উত্তরটি বিশ্লেষণের জন্য কি RegEx ব্যবহার করা সম্ভব?
ক্রিস পোর্টার

2
আপনি যদি এই পোস্টটি দেখতে না পান তবে তার সমস্ত গৌরবতে
অ্যান্ড্রু

3247

যদিও কেবলমাত্র একটি রেইজেক্স সহ নির্বিচারে এইচটিএমএল অসম্ভব, কখনও কখনও এটি এইচটিএমএল-এর একটি সীমাবদ্ধ, পরিচিত সেট পার্স করার জন্য এগুলি ব্যবহার করা উপযুক্ত ।

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

রেজেক্সেস আমার পক্ষে ঠিক কাজ করেছিল এবং সেটআপ করতে খুব দ্রুত ছিল।


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

255
@ মিশেল জনস্টন "কম ভঙ্গুর"? প্রায় অবশ্যই না। এক্সজেএমএল পার্সার নিঃশব্দে উপেক্ষা করতে পারার চেয়ে রেজিজেসগুলি পাঠ্য-বিন্যাসের বিশদ সম্পর্কে যত্নশীল। &foo;এনকোডিং এবং CDATAবিভাগগুলির মধ্যে স্যুইচিং ? ব্রাউজারটি রেন্ডার করে না এমন আপনার দস্তাবেজের সমস্ত সাদা স্থান সরাতে এইচটিএমএল মিনিফায়ার ব্যবহার করছেন? একটি এক্সএমএল পার্সার পাত্তা দেবে না এবং একটিও লিখিত XPath বিবৃতি দেবে না। অন্যদিকে একটি রেজেক্স-ভিত্তিক "পার্সার" ...
চার্লস ডফি

41
@ চার্লস ডফি এক সময়ের কাজের জন্য এটি ঠিক আছে, এবং স্পেসগুলির জন্য আমরা: গুলি +
কোয়ান্টাম

68
@ জিয়াওমোও, যদি বাকি সময় "আপনার জন্য কাজ করে" ব্যর্থ হয় এমন একটি ৮০% সমাধান পেতে যদি সমস্ত গোটাচা এবং কাজকর্ম সম্পর্কে জানতে হয় তবে আমি আপনাকে থামাতে পারব না। এদিকে, আমি পার্সার ব্যবহার করে বেড়াটির পাশে এসেছি যা সিন্ট্যাক্টিক্যালি বৈধ এক্সএমএল এর 100% এ কাজ করে।
চার্লস ডাফি

374
আমি একবারে একই HTML টেমপ্লেট সহ 10 ডলার পৃষ্ঠাগুলি থেকে কিছু তথ্য টানতে হয়েছিল। এগুলি এইচটিএমএল ত্রুটিগুলির সাথে আবদ্ধ ছিল যা পার্সারদের দম বন্ধ করে দিয়েছে এবং তাদের সমস্ত স্টাইলিং ইনলাইন বা <font>ইত্যাদি ছিল the: ডোম নেভিগেট করতে সহায়তা করার জন্য কোনও ক্লাস বা আইডি নেই। "ডান" পদ্ধতির সাথে সারাদিন লড়াই করার পরে অবশেষে আমি একটি রেজেক্স সমাধানে স্যুইচ করেছি এবং এটি এক ঘন্টার মধ্যে কাজ করতে পেরেছি।
পল এ জংউথर्थ

2037

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

তবে অনেকে চেষ্টা করবেন, কেউ কেউ সাফল্যের দাবিও করবেন - তবে অন্যরা দোষ খুঁজে না পাওয়া পর্যন্ত এবং আপনাকে পুরোপুরি জড়িয়ে ফেলবে।


224
ওপি এক্সএইচটিএমএল: শুরুর ট্যাগগুলির একটি খুব সীমিত উপসেট পার্স করতে বলছে। কী (এক্স) এইচটিএমএলকে একটি সিএফজি তৈরি করে তা হ'ল অন্যান্য উপাদানগুলির শুরু এবং শেষ ট্যাগের মধ্যে উপাদান থাকতে পারে (ব্যাকরণের নিয়মে যেমন A -> s A e)। (এক্স) এইচটিএমএলটিতে কোনও প্রারম্ভিক ট্যাগের মধ্যে এই সম্পত্তি থাকে না : একটি স্টার্ট ট্যাগটিতে অন্য প্রারম্ভিক ট্যাগ থাকতে পারে না। ওপি যে সাবসেটটি পার্স করার চেষ্টা করছে তা কোনও সিএফজি নয়।
লার্শ

101
সি এস তত্ত্ব, নিয়মিত ভাষায় হয় প্রেক্ষাপটে মুক্ত ভাষার কঠোর উপসেট, কিন্তু মূলধারার প্রোগ্রামিং ভাষাতে রেগুলার এক্সপ্রেশন বাস্তবায়নের আরো শক্তিশালী হয়। Noulakaz.net/weblog/2007/03/18/… বর্ণনা হিসাবে , তথাকথিত "নিয়মিত অভিব্যক্তি" আনরিতে প্রাথমিক সংখ্যাগুলি পরীক্ষা করতে পারে, এটি অবশ্যই এমন কিছু যা সিএস তত্ত্বের নিয়মিত প্রকাশটি সম্পাদন করতে পারে না।
অ্যাডাম মিহলসিন

11
@ আইলিডলেসনেস: সমস্ত সিএফজির ক্ষেত্রে একই "কেবল যদি" ​​প্রয়োগ হয়, তাই না? উদাহরণস্বরূপ, যদি (এক্স) এইচটিএমএল ইনপুটটি সুগঠিত না হয় তবে একটি পূর্ণ-বর্ধিত এক্সএমএল পার্সারও নির্ভরযোগ্যভাবে কাজ করবে না। আপনি উল্লেখ করছেন যে "(এক্স) এইচটিএমএল সিনট্যাক্স ত্রুটিগুলি বাস্তব জগতের ব্যবহারকারী এজেন্টগুলিতে প্রয়োগ করা হয়েছে" তার উদাহরণ দিলে আমি বুঝতে পারছি আপনি কী আরও ভাল করছেন।
LarsH

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

26
এটি এখানে সবচেয়ে "পূর্ণ এবং সংক্ষিপ্ত" উত্তর। লোকেরা আনুষ্ঠানিক ব্যাকরণ এবং ভাষার মূল বিষয়গুলি শিখতে নেতৃত্ব দেয় এবং আশা করা যায় যে কয়েকটি গণিত যাতে তারা
বহুবারের

1331

এই ছেলেদের শোনো না। আপনি যদি কাজটি ছোট ছোট টুকরো টুকরো করেন তবে আপনি পুরোপুরি প্রসঙ্গমুক্ত ব্যাকরণকে রেজিজেসের সাথে পার্স করতে পারেন । আপনি কোনও স্ক্রিপ্টের সাহায্যে সঠিক প্যাটার্ন তৈরি করতে পারেন যা এইগুলির প্রতিটি ক্রম করে:

  1. থামানো সমস্যা সমাধান করুন।
  2. একটি বৃত্তের স্কোয়ার করুন।
  3. ও (লগ এন) বা তার চেয়ে কম ক্ষেত্রে ট্র্যাভেলিং সেলসম্যান সমস্যা নিয়ে কাজ করুন। যদি এটি এর চেয়ে বেশি হয় তবে আপনার র‍্যাম শেষ হয়ে যাবে এবং ইঞ্জিনটি স্তব্ধ হয়ে যাবে।
  4. প্যাটার্নটি বেশ বড় হবে, সুতরাং নিশ্চিত হয়ে নিন যে আপনার কাছে এমন একটি অ্যালগোরিদম রয়েছে যা দারুণভাবে এলোমেলোভাবে ডেটা সংকুচিত করে।
  5. প্রায় সেখানে - পুরোটি শূন্য দ্বারা বিভক্ত করুন। সহজ কিছু.

আমি নিজেই শেষ অংশটি শেষ করতে পারি নি, তবে আমি জানি আমি কাছে এসেছি getting এটি CthulhuRlyehWgahnaglFhtagnExceptionকোনও কারণে গুলি ছুঁড়ে রাখে , তাই আমি এটি ভিবি 6 এ ব্যবহার করব এবং ব্যবহার করব On Error Resume Next। আমি কেবলমাত্র দেয়ালের সাথে খোলা এই অদ্ভুত দরজাটি তদন্ত করার পরে কোডটি আপডেট করব। হুম।

পিএস পিয়েরে ডি ফার্মাত কীভাবে এটি করবেন তাও আবিষ্কার করেছিলেন, তবে তিনি যে মার্জিনটি লিখছিলেন তা কোডের পক্ষে যথেষ্ট বড় ছিল না।


79
আপনার উল্লেখ করা অন্যদের তুলনায় শূন্য দ্বারা বিভাজন করা অনেক সহজ সমস্যা। আপনি যদি সরল ভাসমান পয়েন্ট গণিতের পরিবর্তে অন্তরগুলি ব্যবহার করেন (যা প্রত্যেকেরই হওয়া উচিত তবে কেউই নয়) তবে আপনি সুখে কিছুটা [অন্তর অন্তর্ভুক্ত] শূন্য দ্বারা ভাগ করতে পারেন। ফলাফলটি কেবল একটি বিরতি যা প্লাস এবং বিয়োগ অনন্ত সমন্বিত থাকে।
rjmunro

147
আধুনিক পাঠ্য-সম্পাদনা সফ্টওয়্যারটিতে নরম মার্জিনের সাহায্যে ফারমেটের ছোট প্রান্তিক সমস্যার সমাধান হয়েছে।
kd4ttc


29
অবগতির জন্য: ফের্মার সমস্যা হয়েছে আসলে 1995 সালে সমাধান হয়ে , এবং এটি শুধুমাত্র একটি mathematicians 358 বছর তা করার নেন।
jmiserez

10
ঠান্ডা ফিউশন থেকে পাওয়া ব্রাউনিয়ান র‌্যাচেট ব্যবহার করে আমি সেই স্টিকি ডিভিড-বাই-শূন্য পদক্ষেপটি বাইপাস করতে সক্ষম হয়েছি ... যদিও এটি তখনই কাজ করে যখন আমি মহাজাগতিক ধ্রুবকটি সরিয়ে ফেলি।
টিম লেহনার

1072

দাবি অস্বীকার: আপনার কাছে বিকল্প থাকলে পার্সার ব্যবহার করুন। বলেছিল ...

এইচটিএমএল ট্যাগগুলির সাথে ম্যাচ করার জন্য এটি আমি ব্যবহার করি (!)

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>

এটা নিখুঁত নাও হতে পারে, কিন্তু আমি মাধ্যমে এই কোড দৌড়ে অনেক HTML- এর। মনে রাখবেন যে এটি এমনকি অদ্ভুত জিনিসগুলিও ধরেছে <a name="badgenerator"">যা ওয়েবে প্রদর্শিত হয়।

আমার ধারণা এটি স্ব-অন্তর্ভুক্ত ট্যাগগুলির সাথে মেলে না, আপনি কোবির নেতিবাচক চেহারা পিছনে ব্যবহার করতে চাইবেন :

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?<!/\s*)>

অথবা যদি না হয় তবে একত্রিত করুন।

ডাউনভোটারদের কাছে: এটি একটি আসল পণ্য থেকে কোড কাজ করছে। আমি সন্দেহ করি যে এই পৃষ্ঠাটি পড়ছেন এমন কেউ এই ধারণাটি পাবেন যে এটি এইচটিএমএলে রেজিক্সগুলি ব্যবহার করা সামাজিকভাবে গ্রহণযোগ্য।

ক্যাভিয়েট : আমার মনে রাখা উচিত যে সিডিএটিএ ব্লক, মন্তব্য এবং স্ক্রিপ্ট এবং শৈলীর উপাদানগুলির উপস্থিতিতে এই রেজেেক্সটি এখনও ভেঙে যায়। সুসংবাদটি হ'ল, আপনি যারা রেজেক্স ব্যবহার করছেন তাদের থেকে মুক্তি পেতে পারেন ...


94
আমি এমন কিছু নিয়ে যাব যা সর্বজনীনভাবে নিখুঁত না হওয়ার বিষয়ে
কাঁদার

55
কেউ কি এইচটিএমএল-এর ভিতরে সিডিএটা ব্যবহার করছে?
ডানুবিয়ান নাবিক

16
সুতরাং আপনি কেবলমাত্র রেজিপ এক্স দিয়ে পার্সিং সমস্যাটি সমাধান করেন না তবে পার্সারের অংশ হিসাবে এটি কাজ করতে পারে। PS: কাজের পণ্য মানে ভাল কোড নয়। কোনও অপরাধ নয়, তবে এইভাবে শিল্প প্রোগ্রামিং কাজ করে এবং তাদের অর্থ উপার্জন করে
mishmashru

32
আপনার রেজেক্স খুব কম সংক্ষিপ্ততম, বৈধ এইচটিএমএল: এ ব্যর্থ শুরু হয় <!doctype html><title><</title>। সরল '<!doctype html><title><</title>'.match(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g)রিটার্নস ["<!doctype html>", "<title>", "<</title>"]থাকা উচিত ["<title>", "</title>"]

2
যদি আমরা কেবল প্রদত্ত উদাহরণগুলির সাথে মেলে না এবং তার সাথে মেলে না তার চেষ্টা করছি, </<.( ^ ^^^^>]^^^^^^^]]]]]]]]]]????>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ggggg // // // // // // // // // // // // // // // // // // // // j // j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j '' '' '' '' '': "foo বিন্যাস"> <br /> <ঘন্টা বর্গ = "foo বিন্যাস" />'.match(/<.([^r>][^>]*)?>/g)
ইমা

505

এমন কিছু লোক রয়েছে যা আপনাকে বলবে যে পৃথিবীটি গোলাকার (বা তারা সম্ভবত আজব শব্দ ব্যবহার করতে চাইলে পৃথিবীটি একটি স্বরূপ গোলক)। তারা মিথ্যা বলছে.

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

আপনি তাদের বাস্তবতায় থাকতে পারেন বা লাল বড়ি নিতে পারেন।

লর্ড মার্শালের মতো (তিনি কি মার্শালের আত্মীয়? নেট ক্লাস?), আমি আন্ডারভার্স স্ট্যাক বেসড রেজেক্স - শ্লোকটি দেখেছি এবং এমন শক্তি জ্ঞান নিয়ে ফিরে এসেছি যা আপনি কল্পনা করতে পারবেন না। হ্যাঁ, আমার মনে হয় তাদের মধ্যে কোনও ওল্ড ও দু'জন সুরক্ষিত ছিল, তবে তারা টিভিতে ফুটবল দেখছিল, তাই এটি অসুবিধে হয়নি।

আমি মনে করি এক্সএমএল কেসটি বেশ সহজ। আপনার দুর্বল মনের দ্বারা উপলব্ধি করা সহজ করার জন্য RegEx (.NET সিনট্যাক্সে), ডিফ্ল্যাটেড এবং বেস 64 তে কোড করা হয়েছে, এটি এমন কিছু হওয়া উচিত:

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
+r/vD34mUADO1P4/AQAA//8=

সেট করার বিকল্পগুলি হ'ল RegexOptions.ExplicitCapture। আপনি যে ক্যাপচার গ্রুপটি সন্ধান করছেন তা হ'ল ELEMENTNAME। ক্যাপচার গ্রুপটি ERRORখালি না হলে পার্সিং ত্রুটি হয়েছিল এবং রেজেক্স বন্ধ হয়ে গেছে।

যদি আপনার এটি মানব-পঠনযোগ্য রেজেজেমে পুনর্নির্মাণ করতে সমস্যা হয় তবে এটির সহায়তা করা উচিত:

static string FromBase64(string str)
{
    byte[] byteArray = Convert.FromBase64String(str);

    using (var msIn = new MemoryStream(byteArray))
    using (var msOut = new MemoryStream()) {
        using (var ds = new DeflateStream(msIn, CompressionMode.Decompress)) {
            ds.CopyTo(msOut);
        }

        return Encoding.UTF8.GetString(msOut.ToArray());
    }
}

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

ওহ ... যদি আপনি কিছু সহায়ক পদ্ধতির সাহায্যে রেজেক্সের উত্স কোডটি চান:

একটি এক্সএমএল বা সম্পূর্ণ প্লেইন রেজেক্সকে টোকেনাইজ করার জন্য রেজেক্স


68
গুড লর্ড, এটি বিশাল। আমার সবচেয়ে বড় প্রশ্ন কেন? আপনি বুঝতে পেরেছেন যে সমস্ত আধুনিক ভাষায় এক্সএমএল পার্সার রয়েছে, তাই না? 3 লাইনের মতো আপনি যা করতে পারেন তা নিশ্চিত হয়ে উঠবেন it উপরন্তু, এছাড়াও আপনি বুঝতে পারছি না যে বিশুদ্ধ Regex হয় provably নির্দিষ্ট কিছু করার পারছেন না? আপনি যদি না হাইব্রিড রেজেক্স / অপরিহার্য কোড পার্সার তৈরি করেন তবে এটি আপনার মতো মনে হয় না। আপনি কি এলোমেলো ডেটা সংকোচন করতে পারেন?
জাস্টিন মরগান

112
@ জাস্টিন আমার কোনও কারণের দরকার নেই। এটি করা যেতে পারে (এবং এটি অবৈধ / অনৈতিক ছিল না), তাই আমি এটি করেছি। আমরা স্বীকৃত (নেপোলিয়ন হিল) বাদে মনের কোনও সীমাবদ্ধতা নেই ... আধুনিক ভাষাগুলি এক্সএমএলকে পার্স করতে পারে? সত্যি? এবং আমি ভেবেছিলাম যে এটি অবৈধ ছিল! :-)
xanatos

76
স্যার, আমি বিশ্বাসী আমি আমার চিরন্তন গতি মেশিনের জন্য কার্নেলের অংশ হিসাবে এই কোডটি ব্যবহার করতে যাচ্ছি - পেটেন্ট অফিসে এই নির্বোধরা কি আমার আবেদন প্রত্যাখ্যান করতে পারবেন আপনি বিশ্বাস করতে পারেন? ঠিক আছে, আমি তাদের প্রদর্শন করব। আমি তাদের সব দেখাব!
জাস্টিন মরগান

31
@ জাস্টিন সুতরাং একটি এক্সএমএল পার্সার সংজ্ঞায়িত বাগটি মুক্ত, যখন রেইজেক্স নয়? কারণ যদি কোনও এক্সএমএল পার্সার সংজ্ঞা অনুসারে বাগ মুক্ত না করে তবে এমন কোনও এক্সএমএল থাকতে পারে যা এটি ক্রাশ হয়ে যায় এবং আমরা আবার ২ য় ধাপে ফিরে এসেছি this এটি বলা যাক: এক্সএমএল পার্সার এবং এই রেজেক্স উভয়ই "আইনী" পার্স করতে সক্ষম হবেন "এক্সএমএল। তারা কিছু "অবৈধ" এক্সএমএল পার্স করতে পারে। বাগগুলি উভয়কেই ক্র্যাশ করতে পারে। C # XMLReader অবশ্যই এই রেজেক্সের চেয়ে বেশি পরীক্ষিত।
xanatos

31
না, কিছুই ত্রুটিমুক্ত নয়: 1) সমস্ত প্রোগ্রামে কমপক্ষে একটি বাগ থাকে। 2) সমস্ত প্রোগ্রামে অপ্রয়োজনীয় উত্স কোডের কমপক্ষে একটি লাইন থাকে। 3) # 1 এবং # 2 দ্বারা এবং লজিকাল আনয়ন ব্যবহার করে, কোনও প্রোগ্রামকে বাগের মাধ্যমে কোডের একক লাইনে হ্রাস করা যায় তা প্রমাণ করা সহজ বিষয়। (লার্নিং পার্ল থেকে)
স্কট ওয়েভার

299

শেল ইন, আপনি সেড ব্যবহার করে এইচটিএমএল পার্স করতে পারেন :

  1. Turing.sed
  2. এইচটিএমএল পার্সার লিখুন (হোমওয়ার্ক)
  3. ???
  4. লাভ!

সম্পর্কিত (কেন আপনি রেজেক্স ম্যাচ ব্যবহার করবেন না):


3
আমি আশঙ্কা করছি আপনি কৌতুকটি পাবেন না, @ টেনরব। দয়া করে আরও একবার প্রশ্ন এবং স্বীকৃত উত্তরটি পড়ুন। এটি সাধারণভাবে এইচটিএমএল পার্সিং সরঞ্জামগুলি সম্পর্কে নয়, না এইচটিএমএলকে পার্সিং শেল সরঞ্জামগুলি সম্পর্কে নয়, এটি রেজেক্সগুলির মাধ্যমে এইচটিএমএলকে পার্স করার বিষয়ে।
পেরেক

1
না, আবদুল। এটি সম্পূর্ণরূপে, প্রমাণ হিসাবে (গাণিতিক অর্থে) অসম্ভব।
পেরেক

3
হ্যাঁ, এই উত্তরটি এটির সংক্ষিপ্তসার জানায়, @ আবদুল। মনে রাখবেন যে, তবে রেজেক্স বাস্তবায়নগুলি গাণিতিক দিক থেকে নিয়মিত প্রকাশ নয় - তাদের এমন নির্মাণ রয়েছে যা তাদের আরও শক্তিশালী করে তোলে, প্রায়শই টুরিং-সম্পূর্ণ (টাইপ 0 ব্যাকরণের সমতুল্য)। যুক্তিটি এই সত্যটির সাথে ভেঙে যায়, তবে এখনও এই অর্থে কিছুটা বৈধ যে রেজেক্সেস কখনই এই জাতীয় কাজ করার জন্য সক্ষম হতে বোঝেনি।
পেরেক

2
এবং যাইহোক, আমি যে কৌতুকটি উল্লেখ করেছি তা হ'ল কেনরব (র‌্যাডিক্যাল) সম্পাদনার আগে এই উত্তরটির বিষয়বস্তু ছিল, বিশেষত সংশোধন 4, @ আবদুল d
প্যালিক

3
মজার বিষয় হ'ল ওপ কখনই রেজেক্স ব্যবহার করে এইচটিএমএলকে পার্স করতে বলেন নি। তিনি রেজেক্স ব্যবহার করে পাঠ্যটি (যা এইচটিএমএল হতে পারে) মেলাতে বলেছিলেন। যা পুরোপুরি যুক্তিসঙ্গত।
প্যারালাইফ

274

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

মাইক্রোসফ্টের কাছে .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 &gt;ul&lt;, 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 &gt;ul&lt;, 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 &gt;ul&lt;, oh my!</li>                         <li>...</li>                    </ul>               </div>           </li>        </ul>

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


18
System.Textসি # এর অংশ নয়। এটি। নেট এর অংশ।
জন স্যান্ডার্স

8
আপনার Regex (প্রথম লাইন ইন (?=<ul\s*id="matchMe"\s*type="square"\s*>) # match start with <ul id="matchMe"...মধ্যে "উল <" এবং) "ID" হওয়া উচিত \s+নয়, \s*যদি না আপনি এটা <ulid = ... মেলে চান;)
C0deH4cker

@ C0deH4cker আপনি সঠিক, এর \s+পরিবর্তে অভিব্যক্তিটি হওয়া উচিত \s*
স্যাম

4
আমি সত্যই এটি বুঝতে পারি তা নয়, তবে আমার মনে হয় আপনার <img src="images/pic.jpg" />
রেজেেক্সটি

3
@ শাইন্টোড মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমি কোড আপডেট করেছি। পূর্বের এক্সপ্রেশনটি স্ব-সমাধিন্য ট্যাগগুলির /জন্য ব্যর্থ হয়েছিল যা এর কোথাও কোথাও ছিল যা আপনার <img src="images/pic.jpg" />এইচটিএমএল এর জন্য ব্যর্থ হয়েছিল ।
স্যাম

258

আমি পিএইচপি-তে এক্সএমএল এবং এইচটিএমএলকে পার্স করার জন্য কোয়েরিপথ ব্যবহার করার পরামর্শ দিই । এটি মূলত jQuery হিসাবে অনেকটা একই বাক্য গঠন, কেবল এটি সার্ভারের দিকে।


8
@ কাইল — jQuery এক্সএমএল বিশ্লেষণ করে না, এটি পার্সারে ক্লায়েন্টের নির্মিত uses ব্যবহার করে (যদি থাকে তবে)। অতএব আপনাকে এটা করতে jQuery এর প্রয়োজন হবে না, কিন্তু এর দুই লাইন হিসাবে সামান্য হিসাবে প্লেইন পুরোনো জাভাস্ক্রিপ্ট । যদি কোনও পার্সারে অন্তর্নির্মিত না থাকে, jQuery সাহায্য করবে না।
রবজি

1
@ রবজি আসলে jQuery বিল্ট-ইন পার্সার নয়, ডিওএম ব্যবহার করে।
কিউস - মনিিকা

11
@ কিউক্স — আপনি ডকুমেন্টেশনের লেখকদের আরও ভাল করে বলতে চাইলে: " jQuery.parseXML ব্রাউজারের নেটিভ পার্সিং ফাংশনটি ব্যবহার করে ... "। উত্স: jQuery.parseXML ()
RobG

6
মেম প্রশ্ন থেকে এখানে এসেছেন ( meta.stackexchange.com/questions/19478/the-many-memes-of-meta/… ), আমি ভালোবাসি যে উত্তরগুলির একটি ' জাওকুয়েরি ব্যবহার করুন'
জর্ন

221

আপনি যে উত্তরগুলি HTML এর বিশ্লেষণ করতে পারবেন না তা সঠিক হলেও, তারা এখানে প্রয়োগ করে না। ওপি কেবল একটি রেগেক্সের সাথে একটি এইচটিএমএল ট্যাগ বিশ্লেষণ করতে চায় এবং এটি নিয়মিত প্রকাশের সাহায্যে কিছু করা যায়।

প্রস্তাবিত রেজেক্স ভুল, যদিও:

<([a-z]+) *[^/]*?>

আপনি যদি রেজেক্সে কিছু যুক্ত করেন, ব্যাকট্র্যাক করে এটি নির্বোধের মতো জিনিসগুলি মেলাতে বাধ্য করা যেতে পারে <a >>,[^/] এটি অত্যন্ত অনুমোদিত। এছাড়াও <space>*[^/]*এটি নালিশ যে নোট , কারণ [^/]*স্পেস এছাড়াও ম্যাচ করতে পারে।

আমার পরামর্শ হবে

<([a-z]+)[^>]*(?<!/)>

(?<! ... )নেতিবাচক চেহারা-পিছনে (পার্ল রেজিজেসে) কোথায় । এটিতে "a <, তারপরে একটি শব্দ, তারপরে যে কোনও কিছু যা>> নয়, এর মধ্যে শেষটি একটি / তার পরে> হতে পারে না" reads

নোট করুন যে <a/ >এটি (মূল রিজেক্সের মতো) মতো জিনিসগুলিকেও মঞ্জুরি দেয় , সুতরাং আপনি যদি আরও কিছু সীমাবদ্ধ করতে চান তবে স্পেস দ্বারা পৃথক করা গুণাবলীর জোড়গুলির সাথে মেলে তুলতে আপনাকে একটি রেইজেক্স তৈরি করতে হবে।


29
প্রশ্নটি পুরো (এক্স) এইচটিএমএলকে পার্স করার বিষয়ে নয়, এটি (এক্স) এইচটিএমএল ওপেন ট্যাগগুলির সাথে সম্পর্কিত matching
LarsH

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

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

2
এখানে প্রদত্ত উত্তরটি ব্যর্থ হবে যখন কোনও বৈশিষ্ট্যের মানটিতে একটি '>' বা '/' অক্ষর থাকে।
মার্টিন এল

এটি মন্তব্য বা সিডিটা বিভাগযুক্ত HTML এ ভুলভাবে কাজ করবে। যদি কোনও উদ্ধৃত বৈশিষ্ট্যে একটি >চরিত্র থাকে তবে এটি সঠিকভাবে কাজ করবে না । আমি কি ওপি সুপারিশ সম্মত করতে একটি Regex সঙ্গে সম্পন্ন করা, কিন্তু এখানে উপস্থাপন এক সরল করার অনেক দূরে।
জ্যাকসবি

183

চেষ্টা করুন:

<([^\s]+)(\s[^>]*?)?(?<!/)>

এটি আপনার অনুরূপ, তবে শেষটি >অবশ্যই স্ল্যাশের পরে হবে না এবং গ্রহণও করে h1


107
<a href="foo" title="5> 3 "> ওহো </a>
গ্যারেথ

21
এটি খুব সত্য, এবং আমি এটি সম্পর্কে ভেবেছিলাম, তবে আমি ধরে নিয়েছিলাম >প্রতীকটি সঠিকভাবে & gt; এ পালিয়ে গেছে।
কোবি

65
>একটি বৈশিষ্ট্যের মানটিতে বৈধ। প্রকৃতপক্ষে, 'ক্যানোনিকাল এক্সএমএল' সিরিয়ালিয়ায় আপনাকে অবশ্যই ব্যবহার করা উচিত নয় &gt;। (যা সম্পূর্ণরূপে প্রাসঙ্গিক নয়, >এট্রিবিউট মানটির উপর জোর দেওয়া ব্যতীত কোনও অস্বাভাবিক জিনিস নয়))
ববিনসন

5
@ কোবি: বিস্ময়কর চিহ্নটি (আপনি যেটি শেষের দিকে অগ্রসর করেছিলেন) এর অর্থ কী?
মার্কো ডেমাইও

6
@ ববিন্স: আপনি কি নিশ্চিত? আমি আর বুঝতে পারি না, এটিও এই বৈধ এইচটিএমএল:<div title="this tag is a <div></div>">hello</div>
মার্কো ডেমাইও

179

প্রাচীন চীনা কৌশলবিদ, সাধারণ ও দার্শনিক সান জজ বলেছেন:

বলা হয়ে থাকে যে আপনি যদি আপনার শত্রুদের জানেন এবং নিজেকে জানেন তবে আপনি একক ক্ষতি ছাড়াই একশো যুদ্ধে জয়লাভ করতে পারবেন। আপনি যদি কেবল নিজেকে জানেন, তবে আপনার প্রতিপক্ষ নয়, আপনি জিততে পারেন বা হারাতে পারেন। যদি আপনি নিজেকে বা আপনার শত্রু না জেনে থাকেন তবে আপনি সর্বদা নিজেকে বিপন্ন করে তুলবেন।

এক্ষেত্রে আপনার শত্রুটি এইচটিএমএল এবং আপনি নিজেই বা রেজেেক্স। আপনি এমনকি অনিয়মিত regex সঙ্গে পার্ল হতে পারে। এইচটিএমএল জানুন। নিজেকে জানো.

আমি এইচটিএমএলের প্রকৃতি বর্ণনা করে একটি হাইকু রচনা করেছি।

HTML has
complexity exceeding
regular language.

আমি পার্লের রেগেক্সের প্রকৃতি বর্ণনা করে একটি হাইকুও রচনা করেছি।

The regex you seek
is defined within the phrase
<([a-zA-Z]+)(?:[^>]*[^/]*)?>

153
<?php
$selfClosing = explode(',', 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed');

$html = '
<p><a href="#">foo</a></p>
<hr/>
<br/>
<div>name</div>';

$dom = new DOMDocument();
$dom->loadHTML($html);
$els = $dom->getElementsByTagName('*');
foreach ( $els as $el ) {
    $nodeName = strtolower($el->nodeName);
    if ( !in_array( $nodeName, $selfClosing ) ) {
        var_dump( $nodeName );
    }
}

আউটপুট:

string(4) "html"
string(4) "body"
string(1) "p"
string(1) "a"
string(3) "div"

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

আমি নিশ্চিত যে আপনি ইতিমধ্যে ইতিমধ্যে জেনে গেছেন যে এই উদ্দেশ্যে আপনার রেগেক্স ব্যবহার করা উচিত নয়।


1
আপনি যদি সত্যিকারের এক্সএইচটিএমএল নিয়ে কাজ করছেন তবে get এলিমেন্টবাইটিগনাম যুক্ত করুন NSএবং নামের স্থানটি নির্দিষ্ট করুন।
মধ্যস্থতা ওমুরিলিভ

148

আমি এর জন্য আপনার সঠিক প্রয়োজনটি জানি না, তবে আপনি যদি নেটও ব্যবহার করেন তবে আপনি কি এইচটিএমএল এগ্রিলিটি প্যাকটি ব্যবহার করতে পারবেন না ?

উদ্ধৃতাংশ:

এটি একটি। নেট কোড লাইব্রেরি যা আপনাকে "ওয়েবের বাইরে" এইচটিএমএল ফাইলগুলি পার্স করতে দেয়। "বাস্তব বিশ্বের" ত্রুটিযুক্ত এইচটিএমএল সাথে পার্সার অত্যন্ত সহনশীল।


137

আপনি প্রথমটি >ক এর আগে পছন্দ করেন না /। এটি কীভাবে করা যায় তার বিশদ জানতে এখানে দেখুন । এটিকে নেতিবাচক চেহারা হিসাবে চিহ্নিত করা হয়।

যাইহোক, এর একটি নির্লজ্জ বাস্তবায়ন <bar/></foo>এই উদাহরণ নথিতে মিলবে

<foo><bar/></foo>

আপনি যে সমস্যার সমাধানের চেষ্টা করছেন সে সম্পর্কে আপনি আরও কিছু তথ্য সরবরাহ করতে পারেন? আপনি কি প্রোগ্রামের মাধ্যমে ট্যাগের মাধ্যমে পুনরাবৃত্তি করছেন?


1
হ্যাঁ, আমি নিশ্চিত বর্তমানে খোলা সমস্ত ট্যাগ নির্ধারণ করা হচ্ছে, তারপরে এটি একটি পৃথক অ্যারেতে বন্ধ ট্যাগগুলির সাথে তুলনা করুন। RegEx আমার মস্তিষ্কে ব্যথা করে।
জেফ

122

ডাব্লু 3 সি একটি সিডো রিজেক্সপ আকারে পার্সিংয়ের ব্যাখ্যা করেছে: ডাব্লু
3 সি লিঙ্ক

জন্য Var লিঙ্কগুলি অনুসরণ করুন QName, Sএবং Attributeএকটা পরিষ্কার ছবি পেতে।
এর ভিত্তিতে আপনি স্ট্রিপিং ট্যাগগুলির মতো জিনিসগুলি হ্যান্ডেল করতে একটি খুব ভাল রিজেক্সপ তৈরি করতে পারেন।


5
এটি কোনও psuedo regexp ফর্ম নয়, এটি একটি EBNF ফর্ম, এখানে বর্ণিত: এক্সএমএল স্পেস, পরিশিষ্ট 6
রব জি

106

পিএইচপি-র জন্য আপনার যদি এটির প্রয়োজন হয়:

পিএইচপি করে DOM ফাংশন ঠিকমত কাজ করবে না যদি না তা সঠিকভাবে এক্সএমএল ফরম্যাট করা হয়েছে। বাকি মানবজাতির জন্য তাদের ব্যবহার যত ভাল।

simplehtmldom ভাল, তবে আমি এটি কিছুটা বগি পেয়েছি এবং এটি বেশ স্মৃতিশক্তি [বড় পৃষ্ঠাগুলিতে ক্রাশ হবে Will]

আমি কখনই কোয়েরিপথ ব্যবহার করি নি , সুতরাং এর দরকারীতার বিষয়ে মন্তব্য করতে পারি না।

আরেকটি চেষ্টা করার জন্য হ'ল আমার ডোমপারসার যা সম্পদের উপর খুব হালকা এবং আমি কিছুক্ষণের জন্য সুখে ব্যবহার করছি। শেখার জন্য সহজ এবং শক্তিশালী।

পাইথন এবং জাভার জন্য, অনুরূপ লিঙ্কগুলি পোস্ট করা হয়েছিল।

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


95

সমাধান এখানে:

<?php
// here's the pattern:
$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*(\/>|>)/';

// a string to parse:
$string = 'Hello, try clicking <a href="#paragraph">here</a>
    <br/>and check out.<hr />
    <h2>title</h2>
    <a name ="paragraph" rel= "I\'m an anchor"></a>
    Fine, <span title=\'highlight the "punch"\'>thanks<span>.
    <div class = "clear"></div>
    <br>';

// let's get the occurrences:
preg_match_all($pattern, $string, $matches, PREG_PATTERN_ORDER);

// print the result:
print_r($matches[0]);
?>

এটি গভীরভাবে পরীক্ষা করতে, আমি স্ট্রিংটি স্বয়ংক্রিয়ভাবে বন্ধ হওয়া ট্যাগগুলিতে প্রবেশ করেছি:

  1. <ঘন্টা />
  2. <br/>
  3. <br>

আমি এর সাথে ট্যাগগুলিও প্রবেশ করিয়েছি:

  1. একটি গুণ
  2. একাধিক গুণ
  3. বৈশিষ্ট্যগুলি যা মানটি একক উদ্ধৃতিতে বা ডাবল উদ্ধৃতিতে আবদ্ধ
  4. ডিলিমিটার একটি ডাবল উদ্ধৃতি এবং বিপরীত হয় যখন একক উদ্ধৃতি সমন্বিত বৈশিষ্ট্য
  5. "অ্যারপ্রেটিটি" বৈশিষ্ট্যগুলি "=" চিহ্নের আগে, পরে এটি এবং এর আগে এবং পরে উভয় জায়গার সাথে থাকে।

যদি আপনি এমন কিছু খুঁজে পান যা উপরের ধারণার প্রমাণে কাজ করে না, আমি আমার দক্ষতা উন্নত করার জন্য কোডটি বিশ্লেষণে উপলব্ধ।

<EDIT> আমি ভুলে গিয়েছিলাম যে ব্যবহারকারীর কাছ থেকে নেওয়া প্রশ্নটি স্ব-সমাপ্তি ট্যাগগুলির বিশ্লেষণ এড়ানো উচিত। এক্ষেত্রে প্যাটার্নটি সহজতর, এতে রূপান্তরিত:

$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*>/';

ব্যবহারকারীর @ridgerunner লক্ষ্য করেছেন যে প্যাটার্নটি অমূল্য বৈশিষ্ট্য বা বৈশিষ্ট্যগুলিকে কোনও মূল্য দেয় না । এই ক্ষেত্রে একটি সূক্ষ্ম সুরক্ষা আমাদের নিম্নলিখিত প্যাটার্নগুলি নিয়ে আসে:

$pattern = '/<(\w+)(\s+(\w+)(\s*\=\s*(\'|"|)(.*?)\\5\s*)?)*\s*>/';

</ Edit>

প্যাটার্ন বোঝা

যদি কেউ প্যাটার্ন সম্পর্কে আরও জানতে আগ্রহী হন তবে আমি কিছু লাইন সরবরাহ করি:

  1. প্রথম উপ-এক্সপ্রেশন (\ w +) ট্যাগ নামের সাথে মেলে matches
  2. দ্বিতীয় উপ-এক্সপ্রেশনটিতে একটি গুনের ধরণ রয়েছে। এটি রচনা করেছেন:
    1. এক বা একাধিক সাদা স্থান p s + \
    2. গুণটির নাম (\ ডাব্লু +)
    3. শূন্য বা আরও শ্বেত স্পেস * গুলি * (এটি সম্ভব বা না, এখানে ফাঁকা রেখে দেওয়া)
    4. "=" চিহ্ন
    5. আবার শূন্য বা আরও বেশি সাদা স্থান p
    6. বৈশিষ্ট্য মানের ডিলিমিটার, একটি একক বা দ্বিগুণ উদ্ধৃতি ('| ") the আবার অ্যাট্রিবিউটটির বন্ধকে বিশ্লেষণ করতে, এ কারণেই এটি খুব গুরুত্বপূর্ণ।
    7. বৈশিষ্ট্যের মান, প্রায় কোনও কিছুর সাথে মিলছে : (। *?); এই নির্দিষ্ট সিনট্যাক্সে, লোভী ম্যাচটি ব্যবহার করে (নক্ষত্রের পরে প্রশ্ন চিহ্ন) RegExp ইঞ্জিনটি "চেহারা-সামনের" -র মতো অপারেটর সক্ষম করে, যা এই উপ-এক্সপ্রেশনটিকে অনুসরণ করে যা কিছু মিলে যায়
    8. এখানে মজা আসে: \ 4 অংশটি একটি ব্যাকরিফারেন্স অপারেটর , যা প্যাটার্নের আগে সংজ্ঞায়িত উপ-এক্সপ্রেশনকে বোঝায়, এই ক্ষেত্রে, আমি চতুর্থ উপ-এক্সপ্রেশনকে উল্লেখ করছি, যা পাওয়া প্রথম বৈশিষ্ট্যযুক্ত বিস্ময়কর
    9. শূন্য বা আরও শ্বেতস্থান \ গুলি *
    10. তারকাচিহ্ন দ্বারা প্রদত্ত শূন্য বা আরও বেশি সম্ভাব্য ঘটনার স্পেসিফিকেশন সহ অ্যাট্রিবিউট সাব-এক্সপ্রেশনটি এখানেই শেষ হয়।
  3. তারপরে, যেহেতু কোনও ট্যাগ ">" চিহ্নের আগে একটি শ্বেত স্পেসের সাথে শেষ হতে পারে, তাই শূন্য বা আরও বেশি শ্বেত স্পেস mat গুলি * সাবপ্যাটার্নের সাথে মিলে যায়।
  4. মেলানোর ট্যাগটি একটি সাধারণ ">" চিহ্ন বা একটি সম্ভাব্য এক্সএইচটিএমএল বন্ধ হয়ে শেষ হতে পারে, যা এর আগে স্ল্যাশটিকে ব্যবহার করে: (/> |>)> স্ল্যাশ অবশ্যই পালিয়ে গেছে যেহেতু এটি নিয়মিত প্রকাশের সীমানার সাথে মিলে যায়।

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


12
কোনও মানযুক্ত অর্থাত্ বৈধ ট্যাগগুলির সাথে মেলে না <option selected>। অযোগ্য গুণাবলী মানগুলির সাথে বৈধ ট্যাগগুলির সাথেও মেলে না <p id=10>
রাডারুনার

1
@ অডিগারুন্নার: আপনার মন্তব্যের জন্য অনেক ধন্যবাদ সেক্ষেত্রে প্যাটার্নটি অবশ্যই কিছুটা পরিবর্তন করতে হবে: $ প্যাটার্ন = '/ <(\ ডাব্লু +) (\ এস + (\ ডাব্লু +)) (\ এস * \ = \ এস * (\' | ")) (। *?) \\ 5 * s *)?) * * S *> / '; আমি এটি পরীক্ষা করেছি এবং মূল্যহীন গুণাবলী বা গুণাবলীর ক্ষেত্রে কাজ করি works
ইমানুয়েল দেল গ্র্যান্ড

ট্যাগ নামের আগে একটি স্থান সম্পর্কে কীভাবে: < a href="http://wtf.org" >আমি নিশ্চিত যে এটি আইনী, তবে আপনি এটির সাথে মেলে না।
ফ্লোরিস

7
না দুঃখিত, ট্যাগ নেমের আগে সাদা স্থানগুলি অবৈধ। "বেশ নিশ্চিত" হওয়ার বাইরে আপনি কেন নিজের আপত্তিটির কিছু প্রমাণ সরবরাহ করবেন না? এখানে আমার, w3.org/TR/xML11/#sec-starttags এক্সএমএল ১.১ উল্লেখ করা হয়েছে এবং আপনি এইচটিএমএল 4, 5 এবং এক্সএইচটিএমএলের জন্য একই সন্ধান করতে পারেন, আপনি যদি পরীক্ষা করেন তবে ডাব্লু 3 সি বৈধতাও সতর্ক করবে। আশেপাশে প্রচুর অন্যান্য ব্লা-ব্লাহ-কবি হিসাবে, আমার উত্তরগুলিতে কয়েকশো বিয়োগ ব্যতীত আমি এখনও কোনও বুদ্ধিমান যুক্তি পেলাম না, তা প্রমাণ করার জন্য যে প্রশ্নটিতে উল্লিখিত চুক্তির বিধি অনুসারে আমার কোডটি কোথায় ব্যর্থ হয়েছে । আমি কেবল তাদের স্বাগত জানাই।
ইমানুয়েল দেল গ্র্যান্ডে

@ridgerunner অবশ্যই আপনার মন্তব্য বুদ্ধিমান এবং স্বাগত ছিল।
ইমানুয়েল দেল গ্র্যান্ডে

91

যখনই আমার এইচটিএমএল ডকুমেন্ট থেকে দ্রুত কিছু বের করার দরকার হয়, আমি এটিকে এক্সএমএলে রূপান্তর করতে পরিপাটি ব্যবহার করি এবং তারপরে আমার যা প্রয়োজন তা পেতে এক্সপ্যাথ বা এক্সএসএলটি ব্যবহার করি। আপনার ক্ষেত্রে, এরকম কিছু:

//p/a[@href='foo']

89

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


84

আমি নিয়মিত প্রকাশের সাথে এইচটিএমএল পার্স করতে চাই। আমি ইডিয়ট এইচটিএমএলটি পার্স করার চেষ্টা করি না যা ইচ্ছাকৃতভাবে নষ্ট হয়ে গেছে। এই কোডটি আমার প্রধান পার্সার (পার্ল সংস্করণ):

$_ = join "",<STDIN>; tr/\n\r \t/ /s; s/</\n</g; s/>/>\n/g; s/\n ?\n/\n/g;
s/^ ?\n//s; s/ $//s; print

একে এইচটিএমএলস্প্লিট বলা হয়, প্রতিটি লাইনে একটি ট্যাগ বা টুকরো টুকরো সহ HTML টি লাইনগুলিতে বিভক্ত করে। লাইনগুলি তখন অন্য পাঠ্য সরঞ্জাম এবং স্ক্রিপ্টগুলির সাথে আরও প্রক্রিয়া করা যায় যেমন গ্রেপ , সেড , পার্ল ইত্যাদি I'm আমি এমনকি রসিকতা করছি না :) উপভোগ করুন।

যদি আপনি প্রচুর ওয়েব পৃষ্ঠাগুলি প্রসেস করতে চান তবে আমার স্লর্প-সমস্ত কিছু-প্রথম পার্ল স্ক্রিপ্টটিকে একটি দুর্দান্ত স্ট্রিমিং জিনিসটিতে পুনঃজীবিত করা যথেষ্ট সহজ। তবে এটি আসলে প্রয়োজনীয় নয়।

আমি বাজি ধরছি আমি এর জন্য অবনমিত হব।

এইচটিএমএল স্প্লিট


আমার প্রত্যাশার বিপরীতে এটি কিছু উত্সাহ পেয়েছে, তাই আমি আরও ভাল নিয়মিত প্রকাশের পরামর্শ দেব:

/(<.*?>|[^<]+)\s*/g    # get tags and text
/(\w+)="(.*?)"/g       # get attibutes

এগুলি এক্সএমএল / এক্সএইচটিএমএল এর জন্য ভাল are

সামান্য প্রকরণের সাথে এটি অগোছালো এইচটিএমএল ... বা HTML -> এক্সএইচটিএমএলকে প্রথমে রূপান্তর করতে পারে।


নিয়মিত এক্সপ্রেশন লেখার সর্বোত্তম উপায় হ'ল লেক্স / ইয়্যাক শৈলীতে, অস্বচ্ছ এক-লাইনার বা মন্তব্য করা বহু-লাইন একত্ববাদ হিসাবে নয়। আমি এখানে এটি না, এখনও; এইগুলি সবে এটির প্রয়োজন।


35
"আমি ইচ্ছাকৃতভাবে ভাঙা ইডিয়ট এইচটিএমএলকে পার্স করার চেষ্টা করি না" " কিভাবে আপনার কোড পার্থক্য জানেন?
কেভিন প্যাঙ্কো

ঠিক আছে এইচটিএমএলটি ভেঙে গেছে কিনা তা খুব বেশি কিছু যায় আসে না। জিনিসটি এইচটিএমএলকে ট্যাগ এবং পাঠ্যে বিভক্ত করবে। কেবলমাত্র এটিই আপত্তিজনক হতে পারে যদি লোকেরা টেক্সট বা বৈশিষ্ট্যগুলিতে অনস্কেপড <বা> অক্ষর অন্তর্ভুক্ত করে। অনুশীলনে, আমার ক্ষুদ্র এইচটিএমএল স্প্লিটারটি ভাল কাজ করে। আমার কাছে হিউরিস্টিকতায় পূর্ণ এক বিরাট মনস্ট্রোসিটি চকের দরকার নেই। সহজ সমাধান সবার জন্য নয় ...!
স্যাম ওয়াটকিন্স

আমি এক্সএমএল / এক্সএইচটিএমএলের জন্য ট্যাগ, পাঠ্য এবং বৈশিষ্ট্যগুলি বের করার জন্য কিছু সহজ রেগেক্সপস যুক্ত করেছি।
স্যাম ওয়াটকিন্স

(বৈশিষ্ট্য বাগ 1 পান) /(\w+)="(.*?)"/ডাবল উক্তি অনুমান করে। এটি একক উদ্ধৃতিতে মানগুলি মিস করবে। এইচটিএমএল সংস্করণ 4 এবং এর আগের অনাবৃত মান অনুমোদিত, যদি এটি একটি সাধারণ শব্দ।
ডেভিড অ্যান্ডারসন

(Get বাগ 2 বৈশিষ্ট্যাবলী) /(\w+)="(.*?)"/মিথ্যাভাবে টেক্সট মেলে পারে যে একটি বৈশিষ্ট্য মধ্যে একটি বৈশিষ্ট্য, যেমন মত দেখাচ্ছে <img title="Nope down='up' for aussies" src="..." />। যদি বিশ্বজুড়ে প্রয়োগ করা হয়, তবে এটি সাধারণ পাঠ্যে বা এইচটিএমএল মন্তব্যে এই জাতীয় জিনিসগুলির সাথে মেলে।
ডেভিড অ্যান্ডারসন

74

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


1
htmlawed কিছু চমৎকার আপনি যে কোডটি এটা চিন্তা করতে পারেন হয়েছে যে পার্স এইচটিএমএল ফিল্টার, রূপান্তর, ইত্যাদি অন্য পিএইচপি প্রকল্প!
ব্যবহারকারী594694

না আপনি রেজেক্সের সাহায্যে এইচটিএমএল পার্স করতে পারবেন না । তবে কিছু উপগ্রহের ক্ষেত্রে এটি কার্যকর হতে পারে
মীরাবিলোস

71

সেখানে BBCode সঙ্গে এইচটিএমএল প্রতিস্থাপন জন্য কিছু চমৎকার regexes হয় এখানে । আপনারা সকলেই না-বলছেন, মনে রাখবেন যে তিনি এইচটিএমএলকে পুরোপুরি বিশ্লেষণ করার চেষ্টা করছেন না, কেবল এটি স্যানিটাইজ করার জন্য। তিনি সম্ভবত ট্যাগগুলি মুছে ফেলতে পারবেন যা তার সাধারণ "পার্সার" বুঝতে পারে না।

উদাহরণ স্বরূপ:

$store =~ s/http:/http:\/\//gi;
$store =~ s/https:/https:\/\//gi;
$baseurl = $store;

if (!$query->param("ascii")) {
    $html =~ s/\s\s+/\n/gi;
    $html =~ s/<pre(.*?)>(.*?)<\/pre>/\[code]$2\[\/code]/sgmi;
}

$html =~ s/\n//gi;
$html =~ s/\r\r//gi;
$html =~ s/$baseurl//gi;
$html =~ s/<h[1-7](.*?)>(.*?)<\/h[1-7]>/\n\[b]$2\[\/b]\n/sgmi;
$html =~ s/<p>/\n\n/gi;
$html =~ s/<br(.*?)>/\n/gi;
$html =~ s/<textarea(.*?)>(.*?)<\/textarea>/\[code]$2\[\/code]/sgmi;
$html =~ s/<b>(.*?)<\/b>/\[b]$1\[\/b]/gi;
$html =~ s/<i>(.*?)<\/i>/\[i]$1\[\/i]/gi;
$html =~ s/<u>(.*?)<\/u>/\[u]$1\[\/u]/gi;
$html =~ s/<em>(.*?)<\/em>/\[i]$1\[\/i]/gi;
$html =~ s/<strong>(.*?)<\/strong>/\[b]$1\[\/b]/gi;
$html =~ s/<cite>(.*?)<\/cite>/\[i]$1\[\/i]/gi;
$html =~ s/<font color="(.*?)">(.*?)<\/font>/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/<font color=(.*?)>(.*?)<\/font>/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/<link(.*?)>//gi;
$html =~ s/<li(.*?)>(.*?)<\/li>/\[\*]$2/gi;
$html =~ s/<ul(.*?)>/\[list]/gi;
$html =~ s/<\/ul>/\[\/list]/gi;
$html =~ s/<div>/\n/gi;
$html =~ s/<\/div>/\n/gi;
$html =~ s/<td(.*?)>/ /gi;
$html =~ s/<tr(.*?)>/\n/gi;

$html =~ s/<img(.*?)src="(.*?)"(.*?)>/\[img]$baseurl\/$2\[\/img]/gi;
$html =~ s/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/\[url=$baseurl\/$2]$4\[\/url]/gi;
$html =~ s/\[url=$baseurl\/http:\/\/(.*?)](.*?)\[\/url]/\[url=http:\/\/$1]$2\[\/url]/gi;
$html =~ s/\[img]$baseurl\/http:\/\/(.*?)\[\/img]/\[img]http:\/\/$1\[\/img]/gi;

$html =~ s/<head>(.*?)<\/head>//sgmi;
$html =~ s/<object>(.*?)<\/object>//sgmi;
$html =~ s/<script(.*?)>(.*?)<\/script>//sgmi;
$html =~ s/<style(.*?)>(.*?)<\/style>//sgmi;
$html =~ s/<title>(.*?)<\/title>//sgmi;
$html =~ s/<!--(.*?)-->/\n/sgmi;

$html =~ s/\/\//\//gi;
$html =~ s/http:\//http:\/\//gi;
$html =~ s/https:\//https:\/\//gi;

$html =~ s/<(?:[^>'"]*|(['"]).*?\1)*>//gsi;
$html =~ s/\r\r//gi;
$html =~ s/\[img]\//\[img]/gi;
$html =~ s/\[url=\//\[url=/gi;

15
এটি করবেন না। অনুগ্রহ.
maletor

68

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

একজন রেজিএক্সপ্যাক-অজোনস্টিক সহকর্মী আমাকে এই আলোচনাটি অবহিত করেছেন, যা এই পুরাতন এবং উত্তপ্ত বিষয় সম্পর্কে অবশ্যই ওয়েবে প্রথম নয়।

কিছু পোস্ট পড়ার পরে, আমি প্রথম যে কাজটি করেছি তা এই থ্রেডটিতে "? আর" স্ট্রিংটি খুঁজছিল। দ্বিতীয়টি ছিল "পুনরাবৃত্তি" সম্পর্কে অনুসন্ধান করা।
না, পবিত্র গরু, কোনও মিল খুঁজে পাওয়া যায় নি।
যেহেতু কোনও পার্সার তৈরির মূল প্রক্রিয়াটি কেউ উল্লেখ করেনি, তাই আমি শীঘ্রই অবগত হয়ে গেলাম যে কেউ এই পয়েন্টটি পায়নি।

যদি কোনও (x) এইচটিএমএল পার্সারকে পুনরাবৃত্তি প্রয়োজন হয়, তবে পুনরাবৃত্তি ছাড়াই একটি রেজিএক্সপ্স পার্সার প্রয়োজনীয় নয়। এটি একটি সহজ নির্মাণ।

RegExp কালো শিল্প মাস্টার কঠিন , তাই হয়তো সেখানে আরও সম্ভাবনার আমরা বাদ সময় চেষ্টা এবং আমাদের ব্যক্তিগত সমাধান পরীক্ষার এক হাতে পুরো ওয়েব ক্যাপচার হয় ... ওয়েল, আমি নিশ্চিত এটা সম্পর্কে am :)

যাদু পদ্ধতিটি এখানে:

$pattern = "/<([\w]+)([^>]*?)(([\s]*\/>)|(>((([^<]*?|<\!\-\-.*?\-\->)|(?R))*)<\/\\1[\s]*>))/s";

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

(খেয়াল রাখুন, সেই নোটটিতে আমি ভুলভাবে "মি" মডিফায়ার ব্যবহার করেছি; এটি মুছে ফেলা উচিত, তবুও এটি রেজিএক্সপ ইঞ্জিন দ্বারা বাতিল করা হবে, যেহেতু কোনও ^ বা ch নোঙ্গর ব্যবহার করা হয়নি)।

এখন, আমরা আরও তথ্যের দৃষ্টিকোণ থেকে এই পদ্ধতির সীমাটি সম্পর্কে কথা বলতে পারি:

  1. RegExp ইঞ্জিনের নির্দিষ্ট প্রয়োগ অনুসারে, পুনরাবৃত্তির পার্স করা নেস্টেড প্যাটার্নের সংখ্যার সীমা থাকতে পারে , তবে এটি ব্যবহৃত ভাষার উপর নির্ভর করে
  2. যদিও দূষিত (x) এইচটিএমএল গুরুতর ত্রুটিগুলিতে চালিত হয় না, তবে এটি স্যানিটাইজ করা হয় না ।

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


35
আমি এটি "রেজেক্স যা" অ্যাট্রিবিউটের চেয়ে বড়টিকে অনুমতি দেয় না "তে রাখব। <ইনপুট মান = "5> 3 এর বিপরীতে এটি পরীক্ষা করুন?" />
গ্যারেথ

68
আপনি যদি প্রোডাকশন কোডে সেরকম কিছু রাখেন, তবে সম্ভবত আপনাকে রক্ষণাবেক্ষণকারী দ্বারা গুলি করবে। একটি জুরি তাকে কখনও দোষী সাব্যস্ত করবে না।
aehiilrs

30
নিয়মিত প্রকাশগুলি কাজ করতে পারে না কারণ সংজ্ঞা অনুসারে এগুলি পুনরাবৃত্ত হয় না। নিয়মিত অভিব্যক্তিগুলিতে একটি পুনরাবৃত্ত অপারেটর যুক্ত করা কেবলমাত্র গরিব সিনট্যাক্স সহ একটি সিএফজি করে। ইতিমধ্যে বহিরাগত কার্যকারিতা সহ উপচে পড়া কিছুতে হিংসাত্মকভাবে পুনরাবৃত্তি সন্নিবেশ করানোর পরিবর্তে প্রথম স্থানে পুনরাবৃত্ত হওয়ার জন্য ডিজাইন করা কিছু ব্যবহার করবেন না কেন?
ওয়েলবোগ

16
আমার আপত্তি এটির অন্যতম অন্যতম কার্যকারিতা নয়। RegEx এর সমস্যাটি হ'ল আপনি যখন কাটসির ছোট্ট একটি লাইন পোস্ট করেছেন তখন মনে হয় আপনি আরও দক্ষতার সাথে কিছু করেছেন ("কোডের একটি লাইন দেখুন!")। এবং অবশ্যই কেউই তাদের প্রতারণা-শীট এবং (আশাবাদী) ইনপুটটির প্রতিটি সম্ভাব্য অনুমতি পরীক্ষা করার জন্য অর্ধ ঘন্টা (বা 3) ব্যয় করেছে। এবং একবার আপনি যখন এই সমস্তটি পেরিয়ে যান তখন রক্ষণাবেক্ষণকারী কোডটি বের করে বা বৈধতা দিতে গেলে তারা কেবল এটি দেখতে পারে না এবং দেখুন যে এটি ঠিক। এক্সপ্রেশনটি ছিন্ন করতে হবে এবং মূলত এটির পুনরায় পরীক্ষা করতে হবে ...
ওরেং

15
... এটা ভাল যে জানতে। এবং এটি এমন কি ঘটবে যাঁরা রেজেক্সের সাথে ভাল । এবং সত্যই আমি সন্দেহ করি যে বিপুল সংখ্যক লোক এটিকে ভাল করে জানবে না। সুতরাং আপনি সবচেয়ে কুখ্যাত রক্ষণাবেক্ষণের দুঃস্বপ্নগুলির একটি গ্রহণ করেন এবং এটি পুনরাবৃত্তির সাথে একত্রিত করে যা অন্য রক্ষণাবেক্ষণের দুঃস্বপ্ন এবং আমি নিজেকে মনে করি আমার প্রকল্পে আমার যা প্রয়োজন তা হল একটু কম চালাক is লক্ষ্য কোডটি লিখতে হয় যা খারাপ প্রোগ্রামাররা কোড বেসটি ভঙ্গ না করেই বজায় রাখতে পারে। আমি জানি এটি সর্বনিম্ন সাধারণ ডিনোমিনেটরের কোডে যায়। তবে দুর্দান্ত প্রতিভা
ওরোং

62

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


61
<\s*(\w+)[^/>]*>

অংশগুলি ব্যাখ্যা করেছে:

<: শুরু অক্ষর

\s*: এটি ট্যাগ নামের পূর্বে সাদা স্থান থাকতে পারে (কুরুচিপূর্ণ তবে সম্ভব)।

(\w+): ট্যাগগুলিতে বর্ণ এবং সংখ্যা (এইচ 1) থাকতে পারে। ঠিক আছে, \w'_' এর সাথেও মেলে, তবে এটি অনুমান করে আমার ক্ষতি হয় না। যদি কৌতূহল ব্যবহার করে ([a-zA-Z0-9] +) পরিবর্তে।

[^/>]*: ছাড়া >আর কিছু/ ক্লোজিং পর্যন্ত>

>: বন্ধ >

সম্পর্কহীন

এবং অনুগামী যারা নিয়মিত প্রকাশকে কম মূল্যায়ন করে বলে যে তারা কেবল নিয়মিত ভাষার মতোই শক্তিশালী:

একটি এন বা এন বা এন, যা নিয়মিত নয় এমনকি প্রসঙ্গমুক্তও নয়, এটি মেলা যায়^(a+)b\1b\1$

Backreferencing FTW এর !


@ গ্লিচএমআর, এটি তাঁর বিষয় ছিল। আধুনিক নিয়মিত প্রকাশগুলি প্রযুক্তিগতভাবে নিয়মিত নয়, সেগুলি হওয়ার কোনও কারণ নেই।
অ্যালাকশন

3
@ অ্যালাকেশন: "আধুনিক" নিয়মিত এক্সপ্রেশন (পড়ুন: পার্ল এক্সটেনশন সহ) এর মধ্যে মেলে না O(MN)(এম নিয়মিত প্রকাশের দৈর্ঘ্য, এন পাঠ্যের দৈর্ঘ্য) being পিছনে উল্লেখগুলি এর অন্যতম কারণ। অজানা বাস্তবায়নের পিছনে উল্লেখ নেই এবং O(MN)সময়ের সাথে সমস্ত কিছুর সাথে মেলে ।
কনরাড বোরোস্কি

56

যদি আপনি কেবল সেই ট্যাগগুলি অনুসন্ধান করার চেষ্টা করছেন (পার্সিংয়ের উচ্চাকাঙ্ক্ষী ছাড়াই) এই নিয়মিত অভিব্যক্তিটি চেষ্টা করুন:

/<[^/]*?>/g

আমি এটি 30 সেকেন্ডে লিখেছি এবং এখানে পরীক্ষিত করেছি: http://gskinner.com/RegExr/

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


2
আমি মনে করি আপনি এর \/>পরিবর্তে মানে \\>
জাস্টিন মরগান

না, ঠিক \>আমি যা বোঝাতে চেয়েছি; আমি কখনই আমার আসল পোস্টটির নিয়মিত প্রকাশটি সম্পাদনা করতে চাইনি।
লনি সেরা

2
এফওয়াইআই, আপনার কোণ বন্ধনীগুলি এড়াতে হবে না। অবশ্যই, যাইহোক, এগুলি থেকে বাঁচতে কোনও ক্ষতি করে না, তবে আপনি যে বিভ্রান্তি এড়াতে পারতেন তা দেখুন। ;)
অ্যালান মুর

আমি মাঝে মাঝে অযথা পালাতে পারি যখন আমি নিশ্চিত না যে কোনও কিছু বিশেষ চরিত্র কিনা। আমি উত্তর সম্পাদনা করেছি; এটি একই তবে আরও সংক্ষিপ্তভাবে কাজ করে।
লনি সেরা

এটি এখনই দেখছি, কেন আমি আপনাকে বোঝাতে চেয়েছিলাম তা কেন জানি না \/কারণ এটি প্রয়োজনীয়তার সম্পূর্ণ বিপরীত কাজ করবে। সম্ভবত আমি ভেবেছিলাম আপনি একটি নেতিবাচক ফিল্টার প্যাটার্ন অফার করছেন।
জাস্টিন মরগান

54

আমার কাছে মনে হচ্ছে আপনি শেষের দিকে "/" ছাড়াই ট্যাগগুলি মেলানোর চেষ্টা করছেন। এটা চেষ্টা কর:

<([a-zA-Z][a-zA-Z0-9]*)[^>]*(?<!/)>

8
এটা কাজ করে না. '<Xa = "<b>" /> <y>' ইনপুটটির জন্য ম্যাচগুলি x এবং y হয়, যদিও এক্স সমাপ্ত হয়।
16

51

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

একটি সাধারণ রেজেক্সের মতো <([^>"']|"[^"]*"|'[^']*')*>সাধারণত যথেষ্ট ভাল, যেমনটি আমি সবেমাত্র উল্লেখ করেছি as এটি একটি নির্লজ্জ সমাধান, বিবেচিত সমস্ত জিনিস, তবে এটি >বৈশিষ্ট্যের মানগুলিতে আনঙ্কডবিহীন চিহ্নগুলিকে সঠিকভাবে মঞ্জুরি দেয় । আপনি যদি একটি tableট্যাগ খুঁজছেন, উদাহরণস্বরূপ , আপনি এটি হিসাবে মানিয়ে নিতে পারে</?table\b([^>"']|"[^"]*"|'[^']*')*>

আরও একটি "উন্নত" এইচটিএমএল রেজেক্স কী দেখতে হবে তার একটি ধারণা দেওয়ার জন্য, নিম্নলিখিতটি বাস্তব-বিশ্বের ব্রাউজার আচরণ এবং HTML5 পার্সিং অ্যালগরিদমকে অনুকরণ করার জন্য যথেষ্ট সম্মানজনক কাজ করে:

</?([A-Za-z][^\s>/]*)(?:=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)|[^>])*(?:>|$)

নিম্নলিখিতটি এক্সএমএল ট্যাগগুলির মোটামুটি কঠোর সংজ্ঞাটির সাথে মেলে (যদিও এটি এক্সএমএল নামগুলিতে অনুমোদিত ইউনিকোড অক্ষরের পুরো সেটটির জন্য অ্যাকাউন্ট করে না):

<(?:([_:A-Z][-.:\w]*)(?:\s+[_:A-Z][-.:\w]*\s*=\s*(?:"[^"]*"|'[^']*'))*\s*/?|/([_:A-Z][-.:\w]*)\s*)>

মঞ্জুর, এগুলি পার্শ্ববর্তী প্রসঙ্গ এবং কয়েকটি প্রান্তের মামলার জন্য অ্যাকাউন্ট করে না তবে আপনি যদি সত্যিই চান (যেমন, অন্য রেজেক্সের ম্যাচের মধ্যে অনুসন্ধান করে) এমন জিনিসগুলিও মোকাবেলা করা যেতে পারে।

দিনের শেষে, কাজের জন্য সবচেয়ে উপযুক্ত সরঞ্জামটি ব্যবহার করুন, এমনকি সেই ক্ষেত্রে যখন সেই সরঞ্জামটি একটি রেজেক্স হতে পারে।


49

যদিও এই উদ্দেশ্যে নিয়মিত এক্সপ্রেশন ব্যবহার করা উপযুক্ত এবং কার্যকর নয় মাঝে মাঝে নিয়মিত প্রকাশগুলি সহজ ম্যাচের সমস্যার জন্য দ্রুত সমাধান সরবরাহ করে এবং আমার দৃষ্টিতে তুচ্ছ কাজগুলির জন্য নিয়মিত প্রকাশগুলি ব্যবহার করা হররবাইল নয়।

স্টিভেন লেভিথন রচিত অন্তর্নিহিত এইচটিএমএল উপাদানগুলির সাথে মিলের বিষয়ে একটি নির্দিষ্ট ব্লগ পোস্ট রয়েছে

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