คุณช่วยให้ตัวอย่างบางส่วนของเหตุผลที่มันยากที่จะแยก XML และ HTML ด้วย regex หรือไม่ [ปิด]


402

ข้อผิดพลาดอย่างหนึ่งที่ฉันเห็นคนทำซ้ำแล้วซ้ำอีกคือพยายามแยก XML หรือ HTML ด้วย regex ต่อไปนี้เป็นสาเหตุบางประการในการแยกวิเคราะห์ XML และ HTML:

ผู้คนต้องการปฏิบัติต่อไฟล์เป็นลำดับของบรรทัด แต่สิ่งนี้ใช้ได้:

<tag
attr="5"
/>

ผู้คนต้องการปฏิบัติต่อ <หรือ <แท็กเป็นจุดเริ่มต้นของแท็ก แต่มีลักษณะเช่นนี้อยู่ใน wild:

<img src="imgtag.gif" alt="<img>" />

คนมักต้องการจับคู่แท็กเริ่มต้นกับแท็กสิ้นสุด แต่ XML และ HTML อนุญาตให้แท็กมีตัวเอง (ซึ่ง regex แบบดั้งเดิมไม่สามารถจัดการได้เลย):

<span id="outer"><span id="inner">foo</span></span> 

ผู้คนมักต้องการจับคู่กับเนื้อหาของเอกสาร (เช่นปัญหา "ค้นหาหมายเลขโทรศัพท์ทั้งหมดในหน้าหนึ่ง ๆ " ที่มีชื่อเสียง) แต่ข้อมูลอาจถูกทำเครื่องหมายขึ้น (แม้ว่าจะดูเหมือนเป็นเรื่องปกติเมื่อดู):

<span class="phonenum">(<span class="area code">703</span>)
<span class="prefix">348</span>-<span class="linenum">3020</span></span>

ความคิดเห็นอาจมีแท็กที่จัดรูปแบบไม่ดีหรือไม่สมบูรณ์:

<a href="foo">foo</a>
<!-- FIXME:
    <a href="
-->
<a href="bar">bar</a>

gotchas อื่น ๆ ที่คุณรู้จัก?


14
เว็บเบราว์เซอร์เข้าใจเรื่องนี้เป็นล้าน ๆ ครั้งต่อวินาทีใครบางคนไม่สามารถสร้างคลาส parser สำหรับเว็บเพจได้
Jon Winstanley

24
จอนพวกเขามี ใน Perl มี HTML :: Parser, HTML :: TreeBuilder และอื่น ๆ อีกมากมาย
Chas Owens

12
คำตอบที่ดีที่สุดคือstackoverflow.com/a/1732454/135078 (Beware Zalgo)
Kelly S. French

3
มีคำอธิบายที่ดีว่าทำไม [คุณไม่สามารถแยกวิเคราะห์ [X] HTML ด้วย regex] [1] [1]: stackoverflow.com/a/1732454/468725
Pavel P

คำตอบ:


260

นี่คือความสนุก XML ที่ถูกต้องสำหรับคุณ:

<!DOCTYPE x [ <!ENTITY y "a]>b"> ]>
<x>
    <a b="&y;>" />
    <![CDATA[[a>b <a>b <a]]>
    <?x <a> <!-- <b> ?> c --> d
</x>

และกลุ่มความสุขเล็ก ๆ นี้เป็น HTML ที่ถูกต้อง:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" [
    <!ENTITY % e "href='hello'">
    <!ENTITY e "<a %e;>">
]>
    <title>x</TITLE>
</head>
    <p id  =  a:b center>
    <span / hello </span>
    &amp<br left>
    <!---- >t<!---> < -->
    &e link </a>
</body>

ไม่พูดถึงการแยกวิเคราะห์เฉพาะเบราว์เซอร์ทั้งหมดสำหรับการสร้างที่ไม่ถูกต้อง

ขอให้โชคดีที่หลุมบ่อ regex กับ!

แก้ไข (Jörg W Mittag): นี่คืออีกส่วนหนึ่งที่มีรูปแบบที่ดี HTML 4.01 ที่ถูกต้อง:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd"> 
<HTML/
  <HEAD/
    <TITLE/>/
    <P/>

6
หนึ่ง XML หรือไม่ มีโครงสร้างที่แตกต่างกันเล็กน้อยซึ่งเป็นปัญหาหรือไม่ ชุดย่อยภายใน DTD? นั่นคือการกำหนด & เอนทิตี้ใหม่; เรียกว่า 'y' ซึ่งมีลำดับ ']>' ซึ่งตามปกติหากไม่อยู่ในเครื่องหมายอัญประกาศให้ปิดชุดย่อยภายใน
bir

16
(นี่แสดงให้เห็นว่าคุณจะต้องมีความรู้ลึกค่อนข้างเกี่ยวกับบางส่วนของ DTD ลึกลับโบราณมากขึ้นและคุณสมบัติของ XML เพื่อแยกเอกสารอย่างถูกต้องแม้ว่าคุณจะไม่ได้เป็นตัวแยกวิเคราะห์ DTD การตรวจสอบ.)
bobince

17
ตัวอย่าง HTML ใช้ประโยชน์จากคุณสมบัติที่ไม่ค่อยเป็นที่รู้จัก: shorttags อ่านเพิ่มเติมได้ที่w3.org/QA/2007/10/shorttags.html
netvope

25
ทุกครั้งที่มีคนเขียน HTML ดังที่แสดงไว้ด้านบน Tim Berners-Lee กำจัดน้ำตาเพียงครั้งเดียว
fgysin คืนสถานะโมนิก้า

5
ฉันชอบที่เครื่องมือเน้นข้อความของ Stackoverflow ล้มเหลวในการปรากฏตัวครั้งแรกของ "]"
GlassGhost

71

แท้จริง

<img src="imgtag.gif" alt="<img>" />

ไม่ใช่ HTML ที่ถูกต้องและไม่ใช่ XML ที่ถูกต้องเช่นกัน

ไม่ใช่ XML ที่ถูกต้องเพราะ '<' และ '>' ไม่ใช่อักขระที่ถูกต้องภายในสตริงของแอตทริบิวต์ พวกเขาจะต้องหลบหนีโดยใช้หน่วยงาน XML ที่สอดคล้องกัน & lt; และ & gt;

มันไม่ถูกต้อง HTML อย่างใดอย่างหนึ่งเนื่องจากไม่อนุญาตให้ใช้แบบฟอร์มปิดสั้นใน HTML (แต่ถูกต้องใน XML และ XHTML) แท็ก 'img' ยังเป็นแท็กที่ปิดโดยนัยตามข้อกำหนดของ HTML 4.01 ซึ่งหมายความว่าการปิดแท็กด้วยตนเองนั้นผิดจริงและเทียบเท่ากับการปิดแท็กอื่นสองครั้ง

เวอร์ชันที่ถูกต้องใน HTML คือ

<img src="imgtag.gif" alt="&lt;img&gt;">

และรุ่นที่ถูกต้องใน XHTML และ XML คือ

<img src="imgtag.gif" alt="&lt;img&gt;"/>

ตัวอย่างต่อไปนี้ที่คุณให้นั้นไม่ถูกต้องเช่นกัน

<
tag
attr="5"
/>

นี่ไม่ใช่ HTML หรือ XML ที่ถูกต้องเช่นกัน ชื่อของแท็กจะต้องอยู่ด้านหลัง '<' แม้ว่าแอตทริบิวต์และการปิด '>' อาจเป็นที่ใดก็ตามที่พวกเขาต้องการ ดังนั้น XML ที่ถูกต้องจึงเป็นจริง

<tag
attr="5"
/>

และนี่เป็นอีกหนึ่งฟังก์ชั่นที่สนุกกว่า: คุณสามารถเลือกที่จะใช้อักขระ "หรือ" เป็นอักขระในการอ้างคุณสมบัติ

<img src="image.gif" alt='This is single quoted AND valid!'>

เหตุผลอื่น ๆ ทั้งหมดที่โพสต์นั้นถูกต้อง แต่ปัญหาที่ใหญ่ที่สุดของการแยกวิเคราะห์ HTML คือคนมักจะไม่เข้าใจกฎไวยากรณ์ทั้งหมดอย่างถูกต้อง ความจริงที่ว่าเบราว์เซอร์ของคุณตีความแท็กของคุณเป็น HTML ไม่ได้หมายความว่าคุณเขียน HTML ที่ถูกต้องจริง

แก้ไข: และแม้กระทั่ง stackoverflow.com เห็นด้วยกับฉันเกี่ยวกับคำจำกัดความที่ถูกต้องและไม่ถูกต้อง XML / HTML ที่ไม่ถูกต้องของคุณจะไม่ถูกเน้นในขณะที่รุ่นที่แก้ไขของฉันคือ

โดยพื้นฐานแล้ว XML จะไม่ถูกแยกวิเคราะห์ด้วย regexps แต่ก็ไม่มีเหตุผลที่จะทำเช่นนั้น มีตัวแยกวิเคราะห์ XML จำนวนมากสำหรับแต่ละภาษา คุณมีทางเลือกระหว่าง SAX parsers, DOM parsers และ Pull parsers ทั้งหมดเหล่านี้รับประกันว่าจะเร็วกว่าการแยกวิเคราะห์ด้วย regexp และจากนั้นคุณสามารถใช้เทคโนโลยีที่ยอดเยี่ยมเช่น XPath หรือ XSLT บนต้นไม้ DOM ที่เกิดขึ้น

คำตอบของฉันคือ: ไม่เพียง แต่การแยกวิเคราะห์ XML ด้วย regexps อย่างหนัก แต่ก็เป็นแนวคิดที่ไม่ดีเช่นกัน เพียงใช้ตัวแยกวิเคราะห์ XML ที่มีอยู่หนึ่งในล้านและใช้ประโยชน์จากคุณลักษณะขั้นสูงทั้งหมดของ XML

HTML นั้นยากเกินไปที่จะลองแยกวิเคราะห์ด้วยตัวเอง ก่อนอื่นไวยากรณ์ทางกฎหมายมีรายละเอียดปลีกย่อยเล็ก ๆ น้อย ๆ มากมายที่คุณอาจไม่ทราบและอย่างที่สอง HTML ในรูปแบบไวด์เป็นเพียงกองเหม็นอันยิ่งใหญ่ของคุณ มีไลบรารี lars parser หลากหลายประเภทที่ทำงาน HTML จัดการแท็กได้ดี


8
คุณไม่จำเป็นต้องหลบหนี> เหมือน>
Joey

8
โอเค s / ใช้ได้ / มีอยู่ใน wild / g
Chas Owens

1
ที่จริงแล้วตามข้อกำหนดคุณต้องหลบหนี> เป็น> เช่นเดียวกับที่คุณต้องหนี <เป็น <& และ & amp; และในคุณลักษณะ "as & quot; และ" as & apos; เป็นเพียงเครื่องมือแยกวิเคราะห์จำนวนมาก
LordOfThePigs

19
ข้อมูลจำเพาะไม่ได้บอกว่า '>' ต้องหนี - ยกเว้นกรณีพิเศษของลำดับ ']]>' ในเนื้อหา ด้วยเหตุนี้จึงง่ายที่สุดในการหลีกเลี่ยง '>' เสมอ แต่ไม่จำเป็นต้องใช้สเป็ค
bobince

8
>เครื่องหมายถูกต้องสมบูรณ์ใน html stackoverflow.com/questions/94528/…
jfs

56

ฉันเขียนบล็อกทั้งหมดในหัวข้อนี้: ข้อ จำกัด ของนิพจน์ปกติ

ปมของปัญหาคือ HTML และ XML เป็นโครงสร้างแบบเรียกซ้ำซึ่งต้องใช้กลไกการนับเพื่อแยกวิเคราะห์อย่างถูกต้อง regex ที่แท้จริงไม่สามารถนับได้ คุณต้องมีไวยากรณ์ที่ไม่ต้องคำนึงถึงบริบทเพื่อนับ

ย่อหน้าก่อนหน้ามาพร้อมกับข้อแม้เล็กน้อย การใช้งาน regex บางตอนสนับสนุนแนวคิดเรื่องการเรียกซ้ำ อย่างไรก็ตามเมื่อคุณเริ่มเพิ่มการสอบถามซ้ำลงในนิพจน์ regex ของคุณคุณจะยืดขอบเขตและควรพิจารณาตัวแยกวิเคราะห์


20

หนึ่ง gotcha ที่ไม่อยู่ในรายการของคุณคือแอตทริบิวต์สามารถปรากฏในลำดับใดก็ได้ดังนั้นหาก regex ของคุณกำลังมองหาลิงก์ที่มี href "foo" และ class "bar" พวกเขาสามารถเรียงลำดับใดก็ได้และมีจำนวนอื่น ๆ สิ่งต่าง ๆ ระหว่างพวกเขา


อาใช่นั่นเป็นคำถามที่กระตุ้นให้ฉันถามคำถามนี้ (ลิงค์แรก)
Chas Owens

16

ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "การแยกวิเคราะห์" โดยทั่วไปการพูด XML ไม่สามารถแยกวิเคราะห์โดยใช้ regex เนื่องจากไวยากรณ์ XML นั้นไม่ปกติ เพื่อให้ง่าย regexes ไม่สามารถนับได้ (อย่างดี Perl regexes อาจนับจำนวนได้) ดังนั้นคุณจึงไม่สามารถสร้างยอดแท็กแบบเปิด


ฉันเดาว่าการอ้างอิงย้อนหลังสามารถแก้ปัญหาแท็กเปิดและปิดได้
Rishul Matta

1
@RishulMatta: อย่างไร คุณมีการอ้างอิงย้อนกลับจำนวน จำกัด และหมายเหตุที่คุณต้องย้อนกลับแท็ก ... นอกจากนี้คำจำกัดความที่เข้มงวดของ regexes ไม่อนุญาตการย้อนกลับ
Willem Van Onsem

.NET ช่วยให้สมดุลการแสดงออกซึ่งป๊อปและพุชและในทางทฤษฎีสามารถใช้สำหรับการจับคู่ลำดับชั้น แต่มันก็ยังเป็นความคิดที่ไม่ดี
Abel

9

คนทำผิดพลาดจริง ๆ โดยใช้ regex หรือเพียงแค่ดีพอสำหรับงานที่พวกเขาพยายามบรรลุ

ฉันเห็นด้วยอย่างยิ่งว่าการแยกวิเคราะห์ html และ xml โดยใช้ regex นั้นเป็นไปไม่ได้อย่างที่คนอื่น ๆ ได้ตอบไว้

อย่างไรก็ตามหากความต้องการของคุณไม่ได้แยกวิเคราะห์ html / xml แต่เพียงรับข้อมูลเล็ก ๆ น้อย ๆ ในบิต "รู้จักดี" ของ html / xml ดังนั้นอาจเป็นการแสดงออกปกติหรือแม้กระทั่ง "substring" ที่ง่ายกว่านั้นก็เพียงพอแล้ว


7
กำหนด "ดีพอ" ย่อม regex ง่ายจะไม่ทำงาน ไม่ได้จับคู่บางอย่างหรือจับคู่สิ่งที่คุณไม่ควรเป็นข้อบกพร่องหรือไม่ ถ้าเป็นเช่นนั้นแล้วการใช้ regexes เป็นข้อผิดพลาด โปรแกรมแยกวิเคราะห์ HTML และ XML นั้นใช้งานไม่ยาก การหลีกเลี่ยงการเรียนรู้พวกเขาเป็นเศรษฐกิจที่ผิดพลาด
Chas Owens

1
ตกลงกำหนด "ดีพอ" ให้บอกว่าฉันมีหน้าเว็บที่บอกที่อยู่ IP ของลูกค้า นั่นคือทั้งหมดที่มันทำ ตอนนี้ฉันต้องเขียนแอปพลิเคชันสำหรับเครื่องไคลเอนต์ที่บอกที่อยู่ IP ของเครื่อง ฉันไปที่ไซต์นั้นค้นหาที่อยู่ IP แล้วส่งคืน ไม่จำเป็นต้องแยกวิเคราะห์ HTML!
Robin Day

2
หากคุณมีสตริงที่มีรูปแบบภายใต้การควบคุมของคุณโดยสมบูรณ์ความจริงที่ว่าสตริงนั้นเป็น XML ที่มีรูปแบบที่ดีนั้นไม่เกี่ยวข้องเลย แต่แทบจะไม่มีกรณีการใช้งาน XML จริง ๆ อยู่ในหมวดหมู่นี้
Robert Rossney

15
ฉันสามารถบอกคุณได้จากประสบการณ์อันเจ็บปวดที่ส่วนใหญ่เป็นไปได้ที่จะได้รับสิ่งที่คุณต้องการใช้รูปแบบ regex ที่ซับซ้อนไร้สาระ จนกว่าเว็บไซต์จะมีการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ เฮฮาและคุณสามารถโยน regex นี้ที่ทำให้คุณร้องไห้เป็นเวลาสองวันจากหน้าต่างและเริ่มต้นใหม่
Thomasz

@ Robert: "เกือบจะไม่มีกรณีการใช้งาน" เป็นการพูดเกินจริง จากประสบการณ์ของฉันมีกรณีใช้งานทั่วไป YAGNI ใช้ที่นี่ ... บางครั้ง เคล็ดลับคือการรู้ว่าโซลูชันของคุณต้องกันกระสุนและอยู่ได้นานแค่ไหนสำหรับงานเฉพาะที่คุณกำลังพูดถึง โรบินมีจุดดี เขาแค่บอกว่าการแยกวิเคราะห์ XML แบบเต็มนั้นไม่คุ้มค่าเสมอไป ... ซึ่งเป็นความจริงแม้ว่าคุณจะรู้วิธีใช้งานก็ตาม
LarsH

6

โดยปกติคนทั่วไปจะเริ่มเขียนรูปแบบโลภซึ่งมักจะนำไปสู่การไม่คิดมาก * จัดไฟล์ขนาดใหญ่เข้าไปใน <foo>. * </foo> ที่ใหญ่ที่สุดเท่าที่จะเป็นไปได้


2
เช่นเดียวกับการทำซ้ำ ๆ อย่างขี้เกียจ.*?<คุณสามารถแก้ไขได้โดยใช้คลาสตัวละครที่[^<]*<ไม่ได้อ่าน (ข้อสงวนสิทธิ์: เห็นได้ชัดว่ายังไม่เข้าใจผิดซึ่งเป็นประเด็นของคำถาม)
Rory O'Kane

6

ฉันอยากจะพูดว่า "อย่าคิดค้นวงล้อใหม่" ยกเว้น XML นั้นเป็นรูปแบบที่ซับซ้อนและซับซ้อนจริงๆ ดังนั้นฉันควรจะพูดว่า "อย่าบูรณาการซินโครตรอนใหม่"

บางทีถ้อยคำที่เบื่อหูที่ถูกต้องเริ่มต้น "เมื่อคุณมีค้อน ... " คุณรู้วิธีใช้นิพจน์ทั่วไปการแสดงออกปกติดีในการแยกวิเคราะห์ดังนั้นทำไมต้องเรียนรู้การแยกห้องสมุด XML?

เพราะการแยกวิเคราะห์ XML เป็นเรื่องยาก ความพยายามใด ๆ ที่คุณบันทึกไว้โดยไม่ต้องเรียนรู้การใช้ห้องสมุดการแยกวิเคราะห์ XML จะมากกว่าที่สร้างขึ้นจากจำนวนงานสร้างสรรค์และการแก้ไขข้อผิดพลาดที่คุณต้องทำ เพื่อประโยชน์ของคุณเอง google "ห้องสมุด XML" และใช้ประโยชน์จากงานของคนอื่น


3
มันไม่ซับซ้อนเท่ากับ C ++
โคลจอห์นสัน

6
@ Cole "Cole9" Johnson ฉันจะไม่ใช้ REs ในการแยก C ++ เหมือนกัน
Isaac Rabinovitch

2
หาก XML เป็นซินโครตรอน C ++ จะเป็น Large Hadron Collider
Kevin Kostlan

4

ฉันเชื่อว่าคลาสสิคนี้ มีข้อมูลที่คุณกำลังมองหา คุณสามารถหาจุดในหนึ่งในความคิดเห็นที่นั่น:

ฉันคิดว่าข้อบกพร่องที่นี่คือ HTML เป็นไวยากรณ์ Chomsky Type 2 (บริบทที่ไม่ใช้ไวยากรณ์) และ RegEx เป็นไวยากรณ์ Chomsky Type 3 (นิพจน์ทั่วไป) เนื่องจากไวยากรณ์ของ Type 2 นั้นซับซ้อนกว่าไวยากรณ์ของ Type 3 โดยพื้นฐาน - คุณอาจไม่อยากทำงานนี้ แต่หลายคนจะพยายามบางคนจะอ้างว่าประสบความสำเร็จและคนอื่น ๆ จะพบกับความผิดและทำให้คุณสับสนโดยสิ้นเชิง

ข้อมูลเพิ่มเติมจาก Wikipedia: Chomsky Hierarchy


6
"การแสดงออกปกติ" ไม่ได้มีความหมายเหมือนกันในการสนทนาทางไวยากรณ์อย่างเป็นทางการเหมือนที่นี่ เอ็นจิ้นเรกซ์ที่ยังหลงเหลืออยู่ส่วนใหญ่มีประสิทธิภาพมากกว่าไวยากรณ์แบบ Chomsky Type 3 (เช่นการจับคู่ที่ไม่โลภ เอนจิ้น regex บางตัว (เช่น Perl's) นั้นกำลังทำให้ทัวริงสมบูรณ์ เป็นความจริงที่ว่าแม้จะเป็นเครื่องมือที่ไม่ดีสำหรับการแยกวิเคราะห์ HTML แต่อาร์กิวเมนต์ที่อ้างถึงนี้ไม่ใช่เหตุผลว่าทำไม
dubiousjim

4

ฉันคิดว่าปัญหาเดือดลงไปที่:

  1. Regex นั้นเกือบจะไม่ถูกต้องอย่างสม่ำเสมอ มีอินพุตที่ถูกต้องซึ่งจะไม่สามารถจับคู่ได้อย่างถูกต้อง หากคุณทำงานหนักพอคุณสามารถทำให้ถูกต้อง 99% หรือ 99.999% แต่การทำให้ถูกต้อง 100% นั้นแทบจะเป็นไปไม่ได้เลยเพียงเพราะสิ่งแปลก ๆ ที่ XML อนุญาตโดยใช้เอนทิตี

  2. หาก regex ไม่ถูกต้องแม้กระทั่งสำหรับ 0.00001% ของอินพุตคุณมีปัญหาด้านความปลอดภัยเนื่องจากมีใครบางคนสามารถค้นพบอินพุตเดียวที่จะทำให้แอปพลิเคชันของคุณพัง

  3. ถ้า regex นั้นถูกต้องมากพอที่จะครอบคลุม 99.99% ของคดีมันจะไม่สามารถอ่านได้อย่างทั่วถึงและไม่สามารถทำได้

  4. มีโอกาสมากที่ regex จะทำงานได้ไม่ดีกับไฟล์อินพุตขนาดกลาง การพบกันครั้งแรกของฉันกับ XML คือการแทนที่สคริปต์ Perl ที่ (ไม่ถูกต้อง) แยกวิเคราะห์เอกสาร XML ที่เข้ามาด้วยตัวแยกวิเคราะห์ XML ที่เหมาะสมและเราไม่เพียงแทนที่ 300 บรรทัดของรหัสที่อ่านไม่ได้ด้วย 100 บรรทัดที่ทุกคนเข้าใจได้ จาก 10 วินาทีถึงประมาณ 0.1 วินาที


1

โดยทั่วไปการพูด XML ไม่สามารถแยกวิเคราะห์โดยใช้ regex เนื่องจากไวยากรณ์ XML นั้นไม่ปกติ เพื่อให้ง่าย regexes ไม่สามารถนับได้ (อย่างดี Perl regexes อาจนับจำนวนได้) ดังนั้นคุณจึงไม่สามารถสร้างยอดแท็กแบบเปิด

ฉันไม่เห็นด้วย. หากคุณจะใช้ recursive ใน regex คุณสามารถค้นหาแท็กเปิดและปิดได้อย่างง่ายดาย

ที่นี่ฉันแสดงตัวอย่างของ regex เพื่อหลีกเลี่ยงการแยกวิเคราะห์ข้อผิดพลาดของตัวอย่างในข้อความแรก


ขั้นแรกให้ regexes แบบเรียกซ้ำไม่ใช่นิพจน์ปกติ (ถ้าคุณดูในวงเล็บคุณจะเห็นว่าฉันยอมรับว่า regexes ของ Perl ซึ่งเรียกซ้ำได้สามารถนับสิ่งต่าง ๆ ได้ซึ่งต้องใช้ในการจัดการ HTML) ประการที่สองตัวอย่างของคุณสำหรับ XHTML หรือ XML ที่มีรูปแบบที่ดี HTML นั้นมีรูปแบบไม่ดี ประการที่สามคุณต้องถามตัวเองว่ามันง่ายกว่าที่จะขยายและบำรุงรักษา parser ที่เขียนในภาษา regex แบบเรียกซ้ำหรือภาษาโปรแกรมทั่วไป
Chas Owens

ประการที่สี่แม้ตัวอย่างของคุณจะเสียอย่างเล็กน้อยในขณะที่ยังเป็น XML ที่ถูกต้อง เพิ่มหนึ่งช่องว่างระหว่าง content_block และ id และล้มเหลว ฉันแน่ใจว่าถ้าฉันใช้เวลาอีกไม่กี่นาทีฉันจะพบข้อผิดพลาดทางโครงสร้างอื่น ๆ ในรหัสของคุณ มันไม่ใช่ความคิดที่ดี
Chas Owens

1

ผมให้คำตอบที่ง่ายในการแก้ไขปัญหานี้ที่นี่ ในขณะที่มันไม่ได้มีเครื่องหมาย 100% แต่ฉันอธิบายว่าเป็นไปได้อย่างไรถ้าคุณยินดีที่จะทำงานประมวลผลล่วงหน้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.