الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ماذا ستفعل لتنظيف نص من أوسمة HTML

بدأه Abdullah.Alshammeri في 8 مايو 2011 · 14 رد · 1,493 مشاهدة · في الأخبار والنقاشات التقنية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ،

من باب الفضول ، لو فرضنا أن لديك هذا النص المخزّن في قاعدة بيانات أو ملف عادي ، وتريد تنظيفه من HTML بإستثناء أوسمة معينة تريد الابقاء عليها ( لنفرض أنك تريد الابقاء على الوسم <p> و <h2> , طبعاً يشمل هذا وسم الاغلاق </p> و </h2> ) ، ما أول شيء ممكن يخطر على بالك لحل المشكلة :

<h2>The <b>if...elseif....else</b> Statement</h2>
<p>Use the if....elseif...else statement to select one of several blocks of code to be executed.</p>
<h3>Syntax</h3>
<table class="code notranslate" cellspacing="0" cellpadding="0" border="0" width="100%">
<tbody><tr><td>
if (<i>condition</i>)<br>
  <i>code to be executed if condition is true;</i><br>
elseif (<i>condition</i>)<br>
  <i>code to be executed if condition is true;<br>
</i>else<br>
  <i>code to be executed if condition is false;</i>
</td></tr>
</tbody></table>

<h3>Example</h3>

الموضوع بسيط ومش مستاهل استهلاك سعرات حرارية للتفكير ، لكن لا بأس .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

اما بعض الشعوذة مع التعبيرات المنتظمة او HTMLParser

3
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#3

مره سويتها حسب ما بتذكر

بكل بساطة Notepad++ بالإضافة إلى Regular Expression بسيط لحذف ال Tags! طبعا داخل الإكسبرشن بتقدر تضيف إستثناء بخصوص التاجز التي ترغب بإبقائها.

أو إذا بدك حل سخيف جدا، إفتح ملف ال HTML في المتصفح ثم قم بنسخ النص الذي سوف يظهر لك :D !!

1
#4
ahmed_youssef كتب:

اما بعض الشعوذة مع التعبيرات المنتظمة او HTMLParser

+1 هههه اعجبتني كلمة شعوذة , الكلمة الادق حول الموضوع !

هناك function أستخدمها في PHP :strip_tags

او كما قال احمد يوسف .

3
#5

بالتأكيد أول ما أفكر به هو إدخاله إلى غرفة السيطرة و التحكم باستخدام Regular Expression

1
#6

و الله هذا الشيء يعتمد على مدى اعتمادية "البرنامج" الذي تريد القيام بكتابته. وضعت برنامج بين علامتين تنصيص لأن هذا الأمر يمكن أن يتم عن طريق search/replace متقدمة في IDE محترم و يمكن أن يصل الأمر حتى استخدام مكتبة من العيار الثقيل للحصول على دقة 100% في عملية الـ transformation التي تريد تطبيقها. في النهاية الدقة المطلوبة تعتمد على احتياجاتك. إن كان ما تريد تنفيذه يقتصر على مجموعة من الملفات, فيمكنك كتابة script بسيط بالاستعانة بأحد خبراء بايثون في المنتدى :P و من ثم تحاول معرفة إن كانت الطريقة المستخدمة ناجحة 100% مع مجموعة الملفات التي لديك أم أن هناك حالات لم يتم أخذها في الحسبان و ربما تقول ببعض التعديلات الطفيفة. هذه هي الطريقة الأسرع و لكن الطريقة السليمة هي استخدام html parser متكامل.

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 9 مايو 2011 في 05:00

1
#8
<?php
strip_tag($text, "<p><h2>");
?>

بإستخدم strip_tags

تم تعديل هذه المشاركة بواسطة SonOfTheNile في 9 مايو 2011 في 12:08

1
#9
الشمري كتب:

السلام عليكم ،

من باب الفضول ، لو فرضنا أن لديك هذا النص المخزّن في قاعدة بيانات أو ملف عادي ، وتريد تنظيفه من HTML بإستثناء أوسمة معينة تريد الابقاء عليها ( لنفرض أنك تريد الابقاء على الوسم <p> و <h2> , طبعاً يشمل هذا وسم الاغلاق </p> و </h2> ) ، ما أول شيء ممكن يخطر على بالك لحل المشكلة :

<h2>The <b>if...elseif....else</b> Statement</h2>
<p>Use the if....elseif...else statement to select one of several blocks of code to be executed.</p>
<h3>Syntax</h3>
<table class="code notranslate" cellspacing="0" cellpadding="0" border="0" width="100%">
<tbody><tr><td>
if (<i>condition</i>)<br>
  <i>code to be executed if condition is true;</i><br>
elseif (<i>condition</i>)<br>
  <i>code to be executed if condition is true;<br>
</i>else<br>
  <i>code to be executed if condition is false;</i>
</td></tr>
</tbody></table>

<h3>Example</h3>

الموضوع بسيط ومش مستاهل استهلاك سعرات حرارية للتفكير ، لكن لا بأس .

لا أعرف لاي لغة تريد الحل. تلك هي طريقتي في vb.net

' Create instance of Internet Explorer
Dim ie As New WebBrowser() 
' or ie = createobject("InternetExplorer.Application")
' Navigate to blank page to create empty ie.document
ie.Navigate("about:blank")
' read the html
Dim _html = My.Computer.FileSystem.ReadAllText("C:\xx\html.txt")
' put the html in the browser
ie.Document.Write(_html)
' convert the html to text
Dim puretext = ie.Document.All(0).InnerText
MsgBox(puretext)
1
#10
Notepad++>> CTRL+H
1
#11

notepad++ هو الحل الذي أستخدمه في الغالب ، ولكن هو حل سيء جداً خصوصاً أني لا أجيد ولا أستسيغ شعوذة " RE " ، كما سمّاها أحمد ..

الحل المناسب و الطبيعي هو كما قلتم XML Parser ( سنعمم الموضوع ونقول XML و ليس HTML ) .

ولكن هناك حل أفضل من كل تلك الحلول وهو استخدام XSLT !

في الحقيقة ، اضطررت لأن ألجأ إلى Stackoverflow حتى يساعدوني في إثبات صحة كلامي ، حيث واجهت مشاكل لعدم تمكني من XSLT حتى الآن ، لكن خذوا هذا المثال الذي كتبته في SO :

لنفرض أن لدي هذا الملف :

<root>
<e1 att="test1" att2="test2"> Value</e1>
<e2 att="test1" att2="test2"> Value 2 <inner class='i'>inner</inner></e2>
<e3 att="test1" att2="test2"> Value 3</e3>
</root>

أريد أن أقوم بفلترة بعض العناصر ، حيث أريد إزالة العنصر e3 ، وإزالة Attribute الذي يحمل الاسم att2 ، بحيث تكون النتيجة النهائية هكذا :

<root>
<e1 att="test1" > Value</e1>
<e2 att="test1" > Value 2 <inner class='i'>inner</inner></e2>
</root>

لنفترض أن لدينا مئات الملفات التي لها نفس الحالة ونريد فلترتها .. هل ستتمكن من فعل هذا بإستخدام Regular Expressions وبدون صداع ؟

لأ .

لماذا ؟

لأن Regular Expression عالم ، و XML عالم آخر ، ولأن لدينا شيء اسمه XSLT يقوم بتحويل ملف XML إلى ملف XML آخر ..

اكتب هذا ( كود XSLT بسيط و مقروء ) :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
	<xsl:copy>
  	<xsl:apply-templates select="node()|@*"/>
	</xsl:copy>
  </xsl:template>

  <xsl:template match="e3|@att2"/>

</xsl:stylesheet>

وطبقه على ملف XML الأصلي ( قبل الفلترة ) وستكون النتيجة :

<root>
   <e1 att="test1"> Value</e1>
   <e2 att="test1"> Value 2 <inner class="i">inner</inner>
   </e2>
</root>

حل منظم وبسيط .. وشكراً للزملاء في Stackoverflow على المساعدة :D .

القاعدة :

لا تستخدم Regular Expressions مع ملفات XML .. استخدم XSLT فهي الحل الأمثل .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#12

الشمري

المشكلة مع XSLT ان صفحة الhtml هذه يجب ان يكون كودها نظيفا بحيث تكون valid xml

لكن الذي يحدث عمليا ان هناك العديد من المواقع التي بها اخطاء، وبالتالي المتصفحات ايضا تتغاضى عنها

فممكن ان تمر بموقع ليس strict كفاية حتى يعمل XSLT كما يجب

لهذا السبب انا أأيد HTML Parser لان بعضها مبنية على فرضية تجاهل تلك الاخطاء ايضا

بمعنى انها لا تتطلب strict html وجاهزة للعمل في بيئة الواقع التي تحتوي على html قذر

ليه رحت للخواجات يعم.... الخبير ahmed_yousef والمفتي الجهادي قالها في حكمته في اول رد:

"اما بعض الشعوذة مع التعبيرات المنتظمة او HTMLParser" :D

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

#14

@password123 ، معك حق ، لكن من الخطأ أن نعتمد على HTML ، رأيي هو أن نتقيّد بـ XHTML ، لأن أصلاً HTML ليس XML بل SGML ( ، و هي مواصفات اندثرت و سببت معاناة للبشر خلال التسعينات ) ، لماذا نتقيد بها :-) ، يجب أن تكون ثقافة لأي مبرمج أن يركز على XML و تطبيقاتها ، أنظف وأكثر ترتيبا ً ومقروئية .

بالمناسبة : أعترف أني أخطأت بالعنوان بحديثي عن HTML ، كانت غلطة طبعاً :D ، لم يسعفني الوقت في تصحيحها ، sorry ..أتوقع لو كان الموضوع XHTML ، لرأينا بعض الأعضاء يتحدثون عن XSLT بكل تأكيد ، ولكن شتتكم بحديثي عن HTML :( .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#15

بالمناسبه ياعبد الله ... (أحب أن أندهك يا عبد الله - ولاحظ المسافه - أكثر من الشمري)

عملت ذات مره مع مدير من العيار الثقيل جدا جدا برمجيا ...

كان يقول لي ..

لو أمامك مشكله مثل التي بين يديك الآن ... وهى غير متكرره .. فالحل الأنسب و الانجز هو إستخدام NP++ ... و كان عفريت في إستخدامه .. (تعملت منه الكثير و الكثير في إستخدامه)

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

ربنا يمسيك بالخير يا مديري ... حقا تعلمت منه الكثيييير و الكثييير .. فقد كان عفريتا في أي شئ .. و كل شئ ..

مواضيع مشابهة