www - هل يمكنك تقديم بعض الأمثلة عن سبب صعوبة تحليل XML و HTML مع تعبير عادي؟




www w3schools com html5 (8)

بشكل عام ، لا يمكن تحليل XML باستخدام regex حيث أن قواعد XML ليست منتظمة بأي حال من الأحوال. وبعبارة بسيطة ، لا يمكن الاعتماد على regexes (جيدًا ، قد يكون regexes بيرل قادراً في الواقع على حساب الأشياء) بحيث لا يمكنك موازنة علامات الفتح المفتوحة.

أنا أعترض. إذا كنت ستستخدم العودية في regex ، يمكنك بسهولة العثور على علامات فتح وإغلاق.

لقد عرضت Here مثالًا للتعبير المعتاد لتجنّب تحليل أخطاء الأمثلة في الرسالة الأولى.

خطأ واحد أرى الناس مرة أخرى ومرة ​​أخرى يحاول تحليل XML أو HTML مع تعبير عادي. فيما يلي بعض الأسباب التي تجعل من الصعب تحليل XML و HTML:

يرغب الأشخاص في التعامل مع ملف كتسلسل من الخطوط ، ولكن هذا صحيح:

<tag
attr="5"
/>

يرغب الأشخاص في معاملة <أو <علامة كبداية لعلامة ، ولكن توجد أشياء مثل هذه في البرية:

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

يرغب الأشخاص غالبًا في مطابقة علامات البدء مع علامات النهاية ، لكن XML و HTML يسمحان للعلامات بأن تحتوي على نفسها (والتي لا يمكن للمعاملات التقليدية أن تعالجها على الإطلاق):

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

ما هي الأشياء الأخرى التي تعرفها؟


أعتقد أن this الكلاسيكية لديه المعلومات التي تبحث عنها. يمكنك العثور على النقطة في أحد التعليقات هناك:

أعتقد أن الخلل هنا هو أن HTML عبارة عن قواعد تشومسكي من النوع 2 (قواعد خالية من السياق) و RegEx عبارة عن قواعد تشومسكي من النوع 3 (التعبير العادي). بما أن القواعد النحوية من النوع 2 هي في الأساس أكثر تعقيدًا من قواعد النحو 3 - فلا يمكنك أن تأمل في القيام بهذا العمل . لكن العديد سيحاولون ، سيعلن البعض نجاحه وسيجد الآخرون الخطأ ويخدعونك تمامًا.

بعض مزيد من المعلومات من Homarchy تشومسكي


أعطيت إجابة مبسطة لهذه المشكلة here . على الرغم من أنه لا يمثل علامة 100٪ ، إلا أنني أفسر مدى إمكانية ذلك إذا كنت ترغب في إجراء بعض الأعمال المسبقة.


أميل إلى القول "لا تعيد اختراع العجلة". باستثناء أن XML عبارة عن تنسيق معقد بالفعل . لذا ربما ينبغي لي أن أقول "لا تعيد اختراع السنكروترون."

ربما تبدأ العبارة الصحيحة "عندما يكون كل ما لديك مطرقة ..." أنت تعرف كيف تستخدم تعبيرات عادية ، والتعبير المعتاد جيد في التحليل ، لذا لماذا تهتم بتعلم مكتبة تحليل XML؟

لأن تحليل XML أمر صعب . أي جهد تقوم بحفظه بعدم الحاجة إلى تعلم كيفية استخدام مكتبة تحليل XML سيكون أكثر من كونه مكوّنًا من مقدار العمل الإبداعي و swatting الخطأ الذي يجب عليك القيام به. لمصلحتك الخاصة ، "مكتبة XML" من Google "و" الاستفادة من عمل شخص آخر.


عادة ما يتخلف الناس عن كتابة الأنماط الجشعة ، وكثيراً ما يؤدي ذلك إلى عدم التفكير. * إلتقاط أجزاء كبيرة من الملفات في أكبر ملف <foo> ممكن </ foo>.


فعلا

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

HTML غير صالح ، ولا يعد XML صالحًا.

لا يعد XML صالحًا لأن "<" و ">" ليسا حرفين صالحين داخل سلاسل السمات. يجب أن يتم الإفلات منها باستخدام كيانات XML المقابلة & lt؛ و & gt؛

لا يعد HTML صالحًا لأن نموذج الإغلاق القصير غير مسموح به في HTML (ولكنه صحيح في XML و XHTML). إن العلامة "img" هي أيضًا علامة مغلقة ضمنيًا وفقًا لمواصفات HTML 4.01. هذا يعني أن إغلاقها يدويًا هو في الواقع خطأ ، وهو ما يعادل إغلاق أي علامة أخرى مرتين.

النسخة الصحيحة في HTML

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

والإصدار الصحيح في XHTML و XML

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

المثال التالي الذي قدمته غير صالح أيضًا

<
tag
attr="5"
/>

هذا غير صالح HTML أو XML سواء. يجب أن يكون اسم العلامة مباشرة خلف العلامة "<" ، على الرغم من أن السمات والإغلاق ">" قد يكونان في المكان الذي يريدان. لذلك فإن XML الصحيح هو في الواقع

<tag
attr="5"
/>

وإليك هنا funkier واحد: يمكنك بالفعل اختيار استخدام "أو" كحرف تسميتك للخاصية المميزة

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

جميع الأسباب الأخرى التي تم نشرها صحيحة ، ولكن المشكلة الأكبر في تحليل HTML هي أن الناس عادة لا يفهمون جميع قواعد النحو بشكل صحيح. حقيقة أن متصفحك يفسر علاماتك كملف HTML لا يعني أنك كتبت بالفعل HTML صالح.

تعديل: وحتى .com يتفق معي بشأن تعريف صالح وغير صالح. لم يتم تمييز XML / HTML غير الصالح ، في حين أن النسخة التي قمت بتصحيحها هي.

في الأساس ، لا يتم إجراء XML ليتم تحليلها مع regexps. لكن لا يوجد سبب لذلك. هناك العديد من محلل XML لكل لغة. لديك الخيار بين موزعي SAX ، محلل DOM ومحلل السحب. يتم ضمان كل هذه الأمور بشكل أسرع من التحليل باستخدام تعبير منطقي ويمكن استخدام تقنيات رائعة مثل XPath أو XSLT على شجرة DOM الناتجة.

ولذلك ، فإن ردّي لا يقتصر على تحليل XML مع regexps فقط ، بل هو أيضًا فكرة سيئة. ما عليك سوى استخدام واحد من ملايين محللي XML الحاليين ، والاستفادة من جميع الميزات المتقدمة لـ XML.

HTML من الصعب جدًا حتى محاولة إجراء التحليل بنفسك. أولاً ، يحتوي التركيب القانوني على العديد من التفاصيل الدقيقة التي قد لا تكون على دراية بها ، وثانيًا ، HTML في البرية هي مجرد كومة ضخمة من النتوءات. هناك مجموعة متنوعة من مكتبات التحليل اللغوي المتراخية التي تقوم بعمل جيد في التعامل مع HTML مثل حساء العلامات ، فقط استخدم هذه.


هل يرتكب الأشخاص خطأ بالفعل باستخدام تعبير عادي ، أم أنه ببساطة جيد بما فيه الكفاية للمهمة التي يحاولون تحقيقها؟

أتفق تمامًا على أن تحليل html و xml باستخدام تعبير منطقي غير ممكن كما أجمع الأشخاص الآخرون.

ومع ذلك ، إذا لم يكن الشرط الخاص بك هو تحليل html / xml ولكن فقط الحصول على جزء صغير من البيانات في جزء "معروف جيدًا" من html / xml ، فربما يكون التعبير العادي أو حتى "السلسلة الفرعية" الأكثر بساطة أمرًا جيدًا.


واحد gotcha ليس في قائمتك هو أن السمات يمكن أن تظهر في أي ترتيب ، لذلك إذا كان التعبير المعتاد الخاص بك يبحث عن رابط مع href "foo" و "شريط" الفصل ، يمكن أن تأتي بأي ترتيب ، ولديك أي عدد آخر الأشياء بينهما.





regex