هل ">" (U+003E GREATER-THAN SIGN) مسموح به داخل قيمة سمة عنصر html؟

StackOverflow https://stackoverflow.com/questions/94528

  •  01-07-2019
  •  | 
  •  

سؤال

وبعبارة أخرى يمكن للمرء أن يستخدم /<tag[^>]*>.*?<\/tag>/ regex لتتناسب مع tag عنصر html الذي لا يحتوي على متداخل tag عناصر؟

على سبيل المثال (lt.html):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>greater than sign in attribute value</title>
  </head>
  <body>
    <div>1</div>
    <div title=">">2</div>
  </body>
</html>

التعبير العادي:

$ perl -nE"say $1 if m~<div[^>]*>(.*?)</div>~" lt.html

ومكشطة الشاشة:

#!/usr/bin/env python
import sys
import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(sys.stdin)
for div in soup.findAll('div'):
    print div.string


$ python lt.py <lt.html

كلاهما يعطي نفس الناتج:

1
">2

الناتج المتوقع:

1
2

w3c يقول:

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

هل كانت مفيدة؟

المحلول

نعم، مسموح به (يقبله W3C Validator، ويصدر تحذيرًا فقط).

لا مفر منه < و > يُسمح أيضًا بالتعليقات الداخلية، لذلك يمكن خداع مثل هذا التعبير البسيط.

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

نصائح أخرى

أعتقد أن هذا صحيح، ويوافق عليه مدقق W3C، لكن المصدر الرسمي لهذه المعلومات هو معيار ISO 8879:1986، والذي يكلف حوالي 150 يورو/210 دولارًا أمريكيًا.بغض النظر، ليس من الخطأ تشفيرها، لذلك إذا كنت في شك، قم بالتشفير.بالإضافة إلى ذلك، إذا كنت تستخدم نوع مستند يستند إلى XML، فستحتاج إلى تشفير علامات أكبر من في التسلسل ]]>.

حرفي > يعد أمرًا قانونيًا في كل مكان في محتوى HTML، سواء داخل قيم السمات أو كنص داخل أحد العناصر.

بعد قراءة ما يلي:

http://www.w3.org/International/questions/qa-escapes

يبدو أن عمليات الهروب من الكيان مقترحة في كل مكان (بما في ذلك السمات) لـ < > و&

إذا كنت تصر على استخدام التعبيرات العادية (والتي تناسب عمليات السلسلة الأساسية) فحاول استخدامها <tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>.يجب أن يتطابق مع السمات بشكل مثالي وبالتالي يسمح لك بالوصول إلى المحتوى الداخلي (على الرغم من أنك بحاجة إلى وضعه في مجموعة التقاط).

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

yeah except /<tag[^>]*>.*?<\/tag>/

لن يطابق علامة واحدة، ولكنه يطابق علامة البداية الأولى وعلامة النهاية الأخيرة لعلامة معينة.تمامًا مثل أول مباراة غير جشعة، يجب أن تكون الكلمات البينية غير جشعة أيضًا.

معرفة ما إذا كنت تحصل على نفس النتيجة باستخدام >بدلاً من>

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top