HTML / XML แบ่งออกเป็นมาร์กอัปและเนื้อหา Regex มีประโยชน์ในการทำวิเคราะห์คำแท็กเท่านั้น ฉันเดาว่าคุณสามารถอนุมานเนื้อหาได้ มันจะเป็นตัวเลือกที่ดีสำหรับ SAX parser สามารถส่งแท็กและเนื้อหาไปยังฟังก์ชันที่ผู้ใช้กำหนดซึ่งสามารถติดตามการซ้อน / ปิดองค์ประกอบได้
เท่าที่เป็นเพียงการแยกแท็กก็สามารถทำได้ด้วย regex และใช้ในการแถบแท็กจากเอกสาร
ในการทดสอบเป็นเวลาหลายปีฉันพบความลับในการแยกแท็กของเบราว์เซอร์ทั้งดีและไม่ดี
องค์ประกอบปกติจะถูกแยกวิเคราะห์ด้วยแบบฟอร์มนี้:
หลักของแท็กเหล่านี้ใช้ regex นี้
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
คุณจะสังเกตเห็น[^>]?
ว่านี่เป็นทางเลือกหนึ่ง สิ่งนี้จะตรงกับคำพูดที่ไม่สมดุลจากแท็กที่ไม่มีรูปแบบ
นอกจากนี้ยังเป็นรากที่สำคัญที่สุดของความชั่วร้ายทั้งหมดต่อการแสดงออกปกติ วิธีที่ใช้จะทำให้เกิดการชนเพื่อตอบสนองความโลภของมัน
หากใช้อย่างอดทนไม่มีปัญหา แต่ถ้าคุณบังคับให้จับคู่บางสิ่งด้วยการสลับคู่กับแอตทริบิวต์ / ค่าที่ต้องการและไม่ให้การป้องกันที่เพียงพอจากการย้อนรอยมันเป็นฝันร้ายที่ไม่สามารถควบคุมได้
นี่คือรูปแบบทั่วไปสำหรับแท็กเก่าเพียงธรรมดา สังเกต [\w:]
เห็นชื่อแท็กแทนหรือไม่ ในความเป็นจริงตัวอักษรที่ถูกต้องตามกฎหมายที่ใช้แทนชื่อแท็กนั้นเป็นรายการของอักขระ Unicode อย่างไม่น่าเชื่อ
<
(?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
>
เรายังเห็นว่าคุณไม่สามารถค้นหาแท็กเฉพาะโดยไม่ต้องแยกวิเคราะห์แท็กทั้งหมด ฉันหมายความว่าคุณทำได้ แต่มันจะต้องใช้คำกริยารวมกันเช่น (* SKIP) (* FAIL) แต่ยังต้องแยกแท็กทั้งหมด
เหตุผลคือไวยากรณ์แท็กอาจถูกซ่อนอยู่ภายในแท็กอื่น ๆ
ดังนั้นในการแยกวิเคราะห์แท็กทั้งหมดแบบพาสซีฟจึงจำเป็นต้องมี regex เหมือนกับแท็กด้านล่าง อันนี้ตรงกับเนื้อหาที่มองไม่เห็นเช่นกัน
ในฐานะที่เป็น HTML ใหม่หรือ XML หรืออื่น ๆ พัฒนาสร้างใหม่เพียงแค่เพิ่มมันเป็นหนึ่งในทางเลือก
บันทึกหน้าเว็บ - ฉันไม่เคยเห็นหน้าเว็บ (หรือ xhtml / xml) ที่สิ่งนี้
มีปัญหา หากคุณพบหนึ่งแจ้งให้เราทราบ
หมายเหตุประสิทธิภาพ - รวดเร็ว นี่คือตัวแยกวิเคราะห์แท็กที่เร็วที่สุดที่ฉันเคยเห็น
(อาจจะเร็วกว่าใครจะรู้)
ฉันมีหลายรุ่น นอกจากนี้ยังยอดเยี่ยมเหมือนมีดโกน
(ถ้าคุณเป็นมือแบบ)
ทำ regex ดิบให้สมบูรณ์
<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>
รูปแบบการจัดรูปแบบ
<
(?:
(?:
(?:
# Invisible content; end tag req'd
( # (1 start)
script
| style
| object
| embed
| applet
| noframes
| noscript
| noembed
) # (1 end)
(?:
\s+
(?>
" [\S\s]*? "
| ' [\S\s]*? '
| (?:
(?! /> )
[^>]
)?
)+
)?
\s* >
)
[\S\s]*? </ \1 \s*
(?= > )
)
| (?: /? [\w:]+ \s* /? )
| (?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
| \? [\S\s]*? \?
| (?:
!
(?:
(?: DOCTYPE [\S\s]*? )
| (?: \[CDATA\[ [\S\s]*? \]\] )
| (?: -- [\S\s]*? -- )
| (?: ATTLIST [\S\s]*? )
| (?: ENTITY [\S\s]*? )
| (?: ELEMENT [\S\s]*? )
)
)
)
>