سؤال

لدي محتوى HTML الذي أدخله المستخدم عبر محرر RichText بحيث يمكن أن يكون أي شيء تقريبا (أقل من من المفترض أن يكون خارج علامة الجسم، ولا تقلق بشأن "الرأس" أو Doctype وغيرها). مثال على هذا المحتوى:

<h1>Header 1</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />
<h1>Header 2</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />

الحيلة، أحتاج إلى استخراج أول 100 حرف من النص فقط (تم تجريد علامات HTML). أحتاج أيضا إلى الاحتفاظ بفواصل الأسطر وعدم كسر أي كلمة.

لذلك سيكون الإخراج لما ورد أعلاه شيء مثل:

Header 1
Some text here

Some more text here

A link here

Header 2
Some text here

Some

لديها 98 حرفا واحتفاظ فواصل الأسطر. ما يمكنني تحقيقه حتى الآن هو تجريد جميع علامات HTML باستخدام Regex:

Regex.Replace(htmlStr, "<[^>]*>", "")

ثم تقليم الطول باستخدام Regex أيضا مع:

Regex.Match(textStr, @"^.{1,100}\b").Value

مشكلتي هي، وكيفية الاحتفاظ في خط استراحة؟ أحصل على إخراج مثل:

Header 1
Some text hereSome more text here
A link here
Header 2
Some text hereSome more text

لاحظ الجمل الانضمام؟ ربما شخص ما يمكن أن تظهر لي بعض الطرق الأخرى لحل هذه المشكلة. شكرا!

معلومات اضافية: هدفي هو إنشاء ملخص نص عادي من مجموعة من محتوى HTML. أعتقد أن هذا سوف يساعد في توضيح هذه المشكلة.

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

المحلول 4

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

  • إزالة جميع فواصل الأسطر
  • أضف بادئة استراحة خط لجميع علامات الحظر (مثل Div، P، HR، H1 / 2/3 / 4، إلخ)

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

نصائح أخرى

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

بعد ذلك، قم بإنشاء فصول لكل علامة HTML التي تهتم بها ورثتها من الفصل الأساسي. انطلاقا من مثالك، العلامات التي تهتم بها أكثر هي H1، P، A، و HR. تنفيذ طريقة PrinteLement بحيث تقوم بإرجاع سلسلة تطبع العنصر بشكل صحيح استنادا إلى Innerhtml (مثل Printelement Printelement P " n [Innerhtml] n").

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

أخيرا، انتقل من خلال قائمة انتظارك في استدعاء طريقة PRINTELEMENT لكل عنصر.

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

للحصول على معلومات، تجريد HTML مع Regex ... مليئة بالمشاكل الدقيقة. ال حزمة أجريتي HTML قد يكون أكثر قوة، ولكن لا يزال يعاني من الكلمات تنزف معا:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.InnerText;

طريقة واحدة يمكن أن يكون لتجريم HTML في ثلاث خطوات:

Regex.Replace(htmlStr, "<[^/>]*>", "") // don't strip </.*>
Regex.Replace(htmlStr, "</p>", "\r\n") // all paragraph ends are replaced w/ new line
Regex.Replace(htmlStr, "<[^>]*>", "") // replace remaining </.*>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top