سؤال

أحاول كتابة تعبير عادي لتجريد كل HTML باستثناء الروابط (ملف <a href و </a> العلامات على التوالي.ليس من الضروري أن يكون آمنًا بنسبة 100% (لست قلقًا بشأن هجمات الحقن أو أي شيء لأنني أقوم بتحليل المحتوى الذي تمت الموافقة عليه بالفعل ونشره في موقع فرنك سويسري فيلم).

التعبير العادي "لعلامات الشريط" الأصلي الذي أستخدمه كان <(.|\n)+?>, ، وحاولت تعديله إلى <([^a]|\n)+?>, ، ولكن هذا بالطبع سيسمح لأي علامة تحتوي على أ فيه بدلاً من الذي يحتوي عليه في البداية، بمسافة.

لا ينبغي أن يكون الأمر مهمًا حقًا، ولكن في حالة اهتمام أي شخص بمعرفة ذلك، فأنا أكتب هذا أكشن سكريبت 3.0 ل فلاش فيلم.

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

المحلول

<(?!\/?a(?=>|\s.*>))\/?.*?>

جرب هذا.كان لديه شيء مماثل لعلامات p.عملت لهم لذلك لا أرى لماذا لا.يستخدم lookahead السلبي للتحقق من أنه لا يتطابق مع (مسبوق بحرف / اختياري) حيث (باستخدام lookahead الإيجابي) a (مع اختياري / بادئة) متبوعًا بـ > أو مسافة، أشياء ثم >.ثم يتطابق هذا حتى الحرف التالي.ضع هذا في بديل مع

s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g;

يجب أن يترك هذا فقط علامات الفتح والإغلاق

نصائح أخرى

أستمر في ذلك، لكن لا توجد طريقة يمكنني أن أوصي بها regexr في كثير من الأحيان.إنه أمر رائع لاختبار هذا النوع من الأشياء.

بشكل عام هناك مشاكل مع هذا النهج.تعتبر Regexes هي الأفضل لمطابقات النص "المسطحة" - حيث تدفع البيانات المتداخلة محركات regex إلى المناطق التي لم يتم تصميمها من أجلها.يحتاج تحليل HTML العام إلى محلل وليس محرك regex (ابحث في Google عن الفرق بين اللغات العادية واللغات الخالية من السياق إذا كنت تريد التفاصيل الفنية الكاملة).

من السهل إزالة جميع العلامات عن طريق استبدال /</ و />/ بالسلسلة الفارغة أو ما يعادلها من الكيانات، ولكن تصفية HTML بشكل انتقائي باستخدام التعبيرات المنطقية ستكون عرضة لمجموعة واسعة من المدخلات العرضية أو الضارة التي تؤدي إلى كسر الأشياء.

ها أنت ذا:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}

ماذا عن

<[^a](.|\n)+?>

?

strip_tags() يفعل هذا.

وهنا، أنا بما في ذلك الجميع <a><p><font><b><i><sup> العلامات وإخراج نسخة مرتبة:

cat input.htm | tr -d '\n' | php -r '$input=fgets(STDIN); echo strip_tags($input,"<a><p><font><b><i><sup>");' | tidy -i -wrap 0 -o output.htm
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top