ในความเป็นจริงมีหลายวิธีในการลบความคิดเห็นในข้อความ HTML
มีคุณสมบัติหลายประการของความคิดเห็นเกี่ยวกับข้อความ HTML:
1. ถ้ามันปรากฏเป็นคู่จะมีจุดสิ้นสุดถ้ามันเริ่ม
2. แท็กความคิดเห็นไม่ซ้อนกันและแท็กเริ่มต้นความคิดเห็น (ต่อไปนี้จะเรียกว่า <!-) ถัดไปจะต้องเป็นแท็กสุดท้ายที่สอดคล้องกัน (ต่อไปนี้จะเรียกว่า->)
3. อาจมีหลายแท็กความคิดเห็นในบรรทัด
4. ความคิดเห็นอาจถูกทำลาย
มีสถานการณ์ดังต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
<html>
<!-นี่คือหัว->
<head> หัว </head>
<!-นี่คือ
div ->
<div> a div </div>
<!-นี่คือ
ช่วง-> <!-ขยายเข้าไป
div-> <div> a div </div>
<div> <span> span </span> <div>
<!-นี่คือ
Span-> <div> a div </div> <!-ขยายใน div->
<div> <span> span </span> <div>
<html>
แนวคิด:
1. อ่านข้อความทีละบรรทัด
2. ถ้าบรรทัดมีเพียง <!-และ-> และก่อน <!- ลบเนื้อหาความคิดเห็นโดยตรงระหว่างสองแท็กและรับเนื้อหาอื่น ๆ
3. ถ้าบรรทัดมีเพียง <!-และ-> แต่ <!-หลังจาก-> รับเนื้อหาระหว่างสองแท็กและแท็กได้พบแท็ก <!-
4. ถ้าบรรทัดมีเพียง <!-รับเนื้อหาก่อนแท็กและแท็กได้พบแท็ก <!-
5. ถ้าบรรทัดมีเท่านั้น -> รับเนื้อหาด้านหลังแท็กและแท็กได้พบแท็ก ->
6. ดำเนินการ 2, 3, 4 และ 5 ขั้นตอนสำหรับเนื้อหาที่เหลือของบรรทัด
7. บันทึกส่วนที่เหลือ
8. อ่านบรรทัดถัดไป
คัดลอกรหัสดังนี้: คลาสสาธารณะ htmlcommenthandler {
-
* เครื่องตรวจจับคำอธิบายประกอบในเนื้อหา HTML
-
* @author Boyce
* @version 2013-12-3
-
คลาสคงที่คลาสส่วนตัว htmlcommentdetector {
สตริงสุดท้ายคงที่ส่วนตัว comment_start = "<!-";
สตริงสุดท้ายคงที่ส่วนตัว comment_end = "->";
// เป็นคำอธิบายประกอบของสตริงหมายเหตุประกอบมีแท็กเริ่มต้นของความคิดเห็นและแท็กสุดท้าย "<!-->"
บูลีนแบบคงที่ส่วนตัว isCommentline (สายสตริง) {
return containscommentStartTag (บรรทัด) && containscommentEndTag (บรรทัด)
&& line.indexof (comment_start) <line.indexof (comment_end);
-
// ว่าจะรวมแท็กเริ่มต้นของความคิดเห็น
บูลีนแบบคงที่ส่วนตัวมี compaincommentstarttag (สายสตริง) {
ส่งคืน StringUtils.isnotEmpty (บรรทัด) &&
line.indexof (comment_start)! = -1;
-
// ว่าจะรวมแท็กปลายคำอธิบายประกอบ
บูลีนแบบคงที่ส่วนตัวมี comentcommentendTag (สายสตริง) {
ส่งคืน 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 (เริ่มต้นจบ);
-
สายกลับ;
-
// รับเนื้อหาก่อนที่สัญลักษณ์ความคิดเห็นเริ่มต้น
สตริงคงที่ส่วนตัว getBeforecommentContent (สายสตริง) {
ถ้า (!
สายกลับ;
return line.substring (0, line.indexof (comment_start));
-
// รับเนื้อหาหลังจากบรรทัดความคิดเห็นสิ้นสุด
สตริงคงที่ส่วนตัว getAfterCommentContent (สายสตริง) {
ถ้า (!
สายกลับ;
return line.substring (line.indexof (comment_end) + comment_end.length ());
-
-
-
* อ่านเนื้อหา HTML และลบความคิดเห็น
-
สตริงคงที่สาธารณะ readhtmlContentWithOutComment (BufferedReader Reader) พ่น IOException {
StringBuilder builder = new StringBuilder ();
สตริงบรรทัด = null;
// เป็นบรรทัดปัจจุบันในความคิดเห็น
บูลีน incomment = false;
ในขณะที่ (objectutils.isnotnull (line = reader.readline ())) {
// หากรวมแท็กความคิดเห็น
ในขณะที่ (htmlcommentdetector.containscommentstartTag (บรรทัด) ||
htmlcommentdetector.containscommentendtag (บรรทัด)) {
// ลบเนื้อหาระหว่างแท็กความคิดเห็นที่ปรากฏเป็นคู่
// <!-ความคิดเห็น->
if (htmlcommentdetector.iscommentline (บรรทัด)) {
line = htmlcommentdetector.deletecommentInline (บรรทัด);
-
// ถ้าไม่ใช่บรรทัดความคิดเห็น แต่ฉลากเริ่มต้นและฉลากสุดท้ายยังคงมีอยู่
// xxx-> เนื้อหา <!-
อื่นถ้า (htmlcommentdetector.containscommentstartTag (บรรทัด) && htmlcommentdetector.containscommentendTag (บรรทัด)) {
// หลังจากได้รับแท็กสิ้นสุดข้อความก่อนที่แท็กเริ่มต้นจะถูกตั้งค่าและตั้งค่า incomment เป็น TRUE
line = htmlcommentdetector.getaftercommentcontent (บรรทัด);
line = htmlcommentdetector.getBeforecommentContent (บรรทัด);
incomment = true;
-
// หากมีแท็กเริ่มต้นเท่านั้นเนื่องจากแท็กความคิดเห็นไม่รองรับการทำรังสายที่มีแท็กเริ่มต้นเท่านั้นจะไม่เป็นช่วงเวลาที่แน่นอน
// เนื้อหา <!-
อื่นถ้า (! incomment && htmlcommentdetector.containscommentstartTag (บรรทัด)) {
// ตั้งค่า incomment เป็นจริง รับเนื้อหาก่อนแท็กเริ่มต้น
incomment = true;
line = htmlcommentdetector.getBeforecommentContent (บรรทัด);
-
// ถ้ามีแท็กปลายเท่านั้นที่มีอยู่เนื่องจากแท็กความคิดเห็นไม่รองรับการทำรังเท่านั้นบรรทัดแท็กปลาย
// -> เนื้อหา
อื่นถ้า (incomment && htmlcommentdetector.containscommentendtag (บรรทัด)) {
// ตั้งค่า incomment เป็น FALSE รับเนื้อหาหลังจากแท็กสุดท้าย
incomment = false;
line = htmlcommentdetector.getaftercommentcontent (บรรทัด);
-
// บันทึกเนื้อหาที่ไม่ได้รับการตรวจสอบของบรรทัดนี้
if (stringutils.isnotEmpty (บรรทัด))
builder.append (บรรทัด);
-
// บันทึกบรรทัดที่ไม่มีแท็กความคิดเห็นใน comment = false
if (stringutils.isnotEmpty (บรรทัด) &&! incommment)
builder.append (บรรทัด);
-
return builder.toString ();
-
-
แน่นอนว่ามีวิธีอื่น ๆ อีกมากมายซึ่งสามารถลบได้ผ่านการจับคู่ปกติหรือคุณสามารถเริ่มต้นและสิ้นสุดด้วยแท็กสแต็ก
เดี๋ยวก่อนรหัสข้างต้นได้รับการทดสอบและใช้แล้วและฉันหวังว่ามันจะเป็นประโยชน์สำหรับนักเรียนที่ต้องการ