تجريد جميع الفصول الدراسية من P العلامات

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

  •  19-09-2019
  •  | 
  •  

سؤال

كنت أتساءل فقط عما إذا كان أحد يعرف وظيفة لإزالة جميع الفئات من سلسلة في PHP .. أساسا أريد فقط

<p> 

العلامات بدلا من ذلك

<p class="...">

إذا كان هذا منطقي :)

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

المحلول

من المحتمل أن يعمل Regex ساذج إلى حد ما

$html=preg_replace('/class=".*?"/', '', $html);

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

نصائح أخرى

ربما يكون الأمر مبالغا فيه قليلا لاحتياجاتك، ولكن لتحليل / التحقق من صحة / بيانات HTML نظيفة، أفضل أداة أعرفها هي HTML لتنقية

يسمح لك بتحديد العلامات التي، والسمات، على ما يرام؛ و / أو أي منها ليست كذلك؛ ويعطي HTML صالح / نظيف (X) كإخراج.

(يبدو استخدام Regyxes إلى "تحليل" HTML موافق في البداية ... ثم، عندما تريد إضافة أشياء محددة، يصبح الجحيم عموما لفهم / صيانة)

يمكنك تحميل HTML في فئة Domdocument، قم بتحميل ذلك في SimpleXML. ثم تقوم بإجراء استعلام XPath لجميع عناصر P ثم حلقة من خلالها. في كل حلقة، تقوم بإعادة تسمية سمة الفصل إلى شيء مثل "killmeplease".

عندما يتم ذلك، REOUTPUT PLASTSXML ك XML (والتي، بالمناسبة، قد تغير HTML، ولكن عادة فقط للأفضل)، سيكون لديك سلسلة HTML حيث يحتوي كل p على فئة من "killmeplease". استخدم str_replace لإزالةها بالفعل.

مثال:

$html_file = "somehtmlfile.html";

$dom = new DOMDocument();
$dom->loadHTMLFile($html_file);

$xml = simplexml_import_dom($dom);

$paragraphs = $xml->xpath("//p");

foreach($paragraphs as $paragraph) {
     $paragraph['class'] = "killmeplease";
 }

 $new_html = $xml->asXML();

 $better_html = str_replace('class="killmeplease"', "", $new_html);

أو، إذا كنت ترغب في جعل الرمز أكثر بسيطة ولكن تشابك مع preg_replace، فيمكنك الذهاب مع:

$html_file = "somehtmlfile.html";
$html_string = file_get_contents($html_file);

$bad_p_class = "/(<p ).*(class=.*)(\s.*>)/";

$better_html = preg_replace($bad_p_class, '$1 $3', $html_string);

الجزء الصعب مع تعبيرات منتظمة هو أنهم يميلون إلى أن يكونوا جشعا ومحاولة تشغيل هذا قبالة يمكن أن يسببوا مشاكل إذا كانت علامة العنصر الخاصة بك لديها استراحة في الخط. ولكن إعطاء أي من تلك الطلقة.

$html = "<p id='fine' class='r3e1 b4d 1' style='widows: inherit;'>";    
preg_replace('/\sclass=[\'|"][^\'"]+[\'|"]/', '', $html);

إذا تم طرحك على الاختبار ضد Microsoft Office - تصدير HTML، فستحتاج إلى أكثر من إزالة الفصل أتش تي أم أل لديه أ إشارة التكوين فقط ل Microsoft Office!

خلاف ذلك، يجب أن يكون هذا أكثر أمانا من بعض الإجابات الأخرى التي تعطى أنها جشعة صغيرة ولا تعرف أي نوع من التغليف سيتم استخدامه (' أو ").

ملحوظة: النمط هو في الواقع /\sclass=['|"][^'"]+['|"]/ ولكن، كما كان هناك كلا فاصلة مقلوبة (") apostrophes (')، اضطررت إلى الهروب من جميع حوادث واحدة (\') لتغليف النمط.

أود أن أفعل شيئا مثل هذا على جيس. ضع هذا في رأس صفحتك:

$(document).ready(function(){
$(p).each(function(){
     $(this).removeAttr("class");
     //or  $(this).removeclass("className");
})

});

HTML لتنقية

يمكن أن يكون HTML صعبا للغاية بالنسبة ل Regex بسبب مئات الطرق المختلفة التي يمكن كتابةها أو تنسيقها.

ال HTML لتنقية هي مكتبة مصدر مفتوحة ناضجة لتنظيف HTML. أود أن أنصح استخدامها في هذه الحالة.

في وثائق تكوين جهاز تنقية HTML، يمكنك تحديد الفئات والسمات التي يجب السماح بها وما يجب أن يفعله التنقية إذا وجدها.

http://htmlpurifier.org/docs/

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