في الواقع ، هناك العديد من الطرق لحذف التعليقات في نص HTML.
هناك عدة خصائص للتعليقات على نص HTML:
1. إذا ظهر في أزواج ، فسيكون هناك نهاية إذا بدأت.
2. علامة التعليق غير متداخلة ، وعلامة بدء التعليق (المشار إليها فيما يلي باسم <!-) يجب أن تكون بعد ذلك علامة النهائي المقابلة (المشار إليها فيما يلي->).
3. قد يكون هناك عدة أزواج علامات التعليق في خط.
4. يمكن أيضًا كسر التعليقات.
هناك المواقف التالية تقريبًا:
نسخة الكود كما يلي:
<html>
<!-هذا رأس->
<head> رأس </head>
<!-هذا
Div ->
<div> A Div </iv>
<!-هذا
امتداد-> <!-تمتد في
A Div-> <viv> Div </viv>
<viv> <span> A Span </span> <viv>
<!-هذا هو
span-> <viv> div </viv> <!-تمتد في Div->
<viv> <span> A Span </span> <viv>
<html>
الأفكار:
1. قراءة سطر واحد من النص في وقت واحد.
2. إذا كان الخط يحتوي فقط على <!-و-> وقبل <!-. حذف محتوى التعليق مباشرة بين العلامة والحصول على محتوى آخر.
3. إذا كان الخط يحتوي فقط على <!-و-> ، ولكن <!-بعد->. يحصل على المحتوى بين العلامة ، وواجهت العلامة <!- العلامة.
4. إذا كان الخط يحتوي فقط على <!-، احصل على المحتوى قبل العلامة ، واجهت العلامة العلامة <!-.
5. إذا كان الخط يحتوي فقط على -> ، احصل على المحتوى وراء العلامة ، وواجهت العلامة العلامة ->.
6. تنفيذ 2 و 3 و 4 و 5 خطوات للمحتوى المتبقي للخط.
7. حفظ الباقي.
8. اقرأ السطر التالي.
انسخ الرمز على النحو التالي: الفئة العامة htmlcommentHandler {
/**
* كاشف مشروح في محتوى HTML
*
* Author Boyce
* version 2013-12-3
*/
فئة ثابتة خاصة HTMLCommentDetector {
Static Final String Comment_start = "<!-" ؛
Static Final String Comment_end = "->" ؛
// هل خط التعليق التوضيحي هذا المشروع ، يحتوي على علامة بدء التعليق والعلامة النهائية "<!-->"
isCommentline الساكنة الخاصة (خط السلسلة) {
الإرجاع ContainsCommentStartTag (خط)
&& line.indexof (comment_start) <line.indexof (comment_end) ؛
}
// ما إذا كان يجب تضمين علامة بدء التعليق
ContainsCommentStartTag (خط السلسلة) الثابتة الثابتة
إرجاع StringUtils.isnotempty (الخط) &&
line.indexof (comment_start)! = -1 ؛
}
// ما إذا كان يجب تضمين علامة نهاية التعليق التوضيحي
ContainsCommentEndTag (خط السلسلة) الثابتة الثابتة
إرجاع StringUtils.isnotempty (الخط) &&
line.indexof (comment_end)! = -1 ؛
}
/**
* حذف التعليقات في هذا السطر
*/
سلسلة ثابتة خاصة DELETECOMMENTINLINE (خط السلسلة) {
بينما (IsCommentLine (خط)) {
int start = line.indexof (comment_start) + comment_start.length () ؛
int end = line.indexof (comment_end) ؛
line = line.SubString (ابدأ ، نهاية) ؛
}
خط العودة
}
// احصل على المحتوى قبل START SYMMON
سلسلة ثابتة خاصة getBeforeCommentContent (خط السلسلة) {
if (! continsCommentStartTag (خط))
خط العودة
إرجاع line.substring (0 ، line.indexof (comment_start)) ؛
}
// احصل على المحتوى بعد سطر التعليق النهائي
السلسلة الثابتة الخاصة getAfterCommentContent (خط السلسلة) {
if (! continsCommentEndTag (خط))
خط العودة
return line.SubString (line.indexof (comment_end) + comment_end.length ()) ؛
}
}
/**
* اقرأ محتوى HTML وإزالة التعليقات
*/
السلسلة الثابتة العامة readhtmlContentWithOutComment (قارئ BufferedReader) يلقي IoException {
StringBuilder Builder = new StringBuilder () ؛
خط السلسلة = فارغ ؛
// هو السطر الحالي في التعليق
الوحل المنطقي = خطأ ؛
بينما (ObjectUtils.isnotnull (line = reader.ReadLine ())) {
// إذا تم تضمين علامة التعليق
بينما (htmlcommentdetector.containsCommentStartTag (الخط) ||
htmlcommentdetector.containscommentendtag (خط)) {
// حذف المحتوى بين علامات التعليقات التي تظهر في أزواج
// <!-التعليق->
if (htmlcommentdetector.iscommentline (line)) {
line = htmlcommentdetector.deletecommentInline (line) ؛
}
// إذا لم يكن سطر تعليق ، ولكن لا تزال ملصق START وعلامة النهاية موجودة ، يجب أن تكون الملصق النهائي قبل ملصق البدء
// xxx-> المحتوى <!-
وإلا إذا (htmlcommentdetector.containscommentStartTag (line) && htmlcommentdetector.containsCommentEndTag (line)) {
// بعد الحصول على علامة النهاية ، يتم تعيين النص قبل تعيين علامة البدء وتعيين الوضع إلى True
line = htmlcommentDetector.getAfterCommentContent (الخط) ؛
line = htmlcommentDetector.getBeforeCommentContent (line) ؛
الوضوح = صحيح ؛
}
// إذا كانت علامة البدء فقط موجودة ، لأن علامة التعليق لا تدعم التعشيش ، فإن الخطوط التي تحتوي على علامة البدء فقط لن تكون بالتأكيد غير واضحة
// المحتوى <!-
وإلا إذا
// تعيين الوضع إلى True. احصل على المحتوى قبل علامة البدء
الوضوح = صحيح ؛
line = htmlcommentDetector.getBeforeCommentContent (line) ؛
}
// إذا كانت العلامة النهائية موجودة فقط ، لأن علامة التعليق لا تدعم التعشيش ، يجب أن تكون خطوط العلامات النهائية فقط واقعية
// -> المحتوى
وإلا إذا
// تعيين الوضع لخطأ. احصل على المحتوى بعد علامة النهاية
الوضوح = خطأ ؛
line = htmlcommentDetector.getAfterCommentContent (الخط) ؛
}
// احفظ المحتوى غير المشترك لهذا الخط
if (stringUtils.isnotempty (الخط))
builder.append (خط) ؛
}
// احفظ السطر بدون علامات تعليق في التعليق = خطأ
if (stringUtils.isnotempty (line) &&!
builder.append (خط) ؛
}
إرجاع builder.toString () ؛
}
}
بالطبع ، هناك العديد من الطرق الأخرى ، والتي يمكن حذفها أيضًا من خلال المطابقة العادية ، أو يمكنك البدء والإنهاء مع علامة المكدس.
انتظر ، تم اختبار الكود أعلاه واستخدامه ، وآمل أن يكون مفيدًا للطلاب المحتاجين.