เป็นวิธีที่ดีที่สุดในการเลือกข้อความทั้งหมดระหว่าง 2 แท็ก - เช่น: ข้อความระหว่างแท็ก 'pre' ทั้งหมดในหน้า
/<div>.*?<\/div>/.exec("<div><div></div></div>")
เป็นวิธีที่ดีที่สุดในการเลือกข้อความทั้งหมดระหว่าง 2 แท็ก - เช่น: ข้อความระหว่างแท็ก 'pre' ทั้งหมดในหน้า
/<div>.*?<\/div>/.exec("<div><div></div></div>")
คำตอบ:
คุณสามารถใช้"<pre>(.*?)</pre>"
(แทนที่ข้อความที่คุณต้องการก่อน) และแยกกลุ่มแรก (สำหรับคำแนะนำที่เฉพาะเจาะจงมากขึ้นระบุภาษา) แต่สิ่งนี้ถือว่าความคิดง่าย ๆ ว่าคุณมี HTML ที่เรียบง่ายและถูกต้องมาก
ตามที่ผู้แสดงความคิดเห็นคนอื่นแนะนำไว้หากคุณกำลังทำอะไรที่ซับซ้อนให้ใช้โปรแกรมแยกวิเคราะห์ HTML
<pre>
แท็กหลังจากลอง<pre>(.*?)<\/pre>
แล้วอาจเป็นเพราะคุณกำลังดูสิ่งที่จับคู่แบบเต็มแทนกลุ่มจับภาพ (. *?) ฟังดูวิเศษ แต่ฉันมักจะคิดว่า "วงเล็บ = คู่ของขโมย" เพราะถ้า(
ตามมาด้วย?
ใน(?:
หรือ(?>
ทุกการแข่งขันจะมีการจับสอง: 1 สำหรับการแข่งขันเต็ม & 1 สำหรับกลุ่มการจับ วงเล็บเพิ่มเติมแต่ละชุดจะเพิ่มการดักจับเพิ่มเติม คุณเพียงแค่ต้องรู้วิธีดึงข้อมูลการจับทั้งสองในภาษาที่คุณใช้ด้วย
แท็กสามารถเสร็จสมบูรณ์ในอีกบรรทัดหนึ่ง นี่คือเหตุผล\n
ที่ต้องเพิ่ม
<PRE>(.|\n)*?<\/PRE>
(.|\n)*?
เมื่อจัดการกับแท็ก HTML ข้ามหลายบรรทัด คำตอบที่เลือกใช้งานได้ก็ต่อเมื่อแท็ก HTML อยู่ในบรรทัดเดียวกัน
(.|\n)*?
เพื่อจับคู่อักขระใด ๆ ใช้.
กับs
ตัวปรับ (singleline) เสมอ หรือ[\s\S]*?
วิธีแก้ปัญหา
/\*(.|\n)*?\*/
จึงได้งานที่ - ขอบคุณ
(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
โดยพื้นฐานแล้วมันคืออะไร:
(?<=(<pre>))
การเลือกจะต้องเสริมด้วย<pre>
แท็ก
(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
นี่เป็นเพียงนิพจน์ปกติที่ฉันต้องการใช้ ในกรณีนี้มันจะเลือกตัวอักษรหรือตัวเลขหรือตัวอักษรขึ้นบรรทัดใหม่หรือตัวอักษรพิเศษบางอย่างที่ระบุไว้ในตัวอย่างในวงเล็บเหลี่ยม อักขระ|
ไพพ์หมายถึง " หรือ "
+?
เครื่องหมายบวกระบุสถานะเพื่อเลือกคำสั่งด้านบนอย่างน้อยหนึ่งคำสั่งไม่สำคัญ เครื่องหมายคำถามเปลี่ยนพฤติกรรมเริ่มต้นจาก 'โลภ' เป็น 'ไม่จัดการ'
(?=(</pre>))
การเลือกจะต้องต่อท้ายด้วย</pre>
แท็ก
ขึ้นอยู่กับกรณีการใช้งานของคุณคุณอาจต้องเพิ่มตัวดัดแปลงบางอย่างเช่น ( iหรือm )
ที่นี่ฉันทำการค้นหานี้ใน Sublime Text ดังนั้นฉันไม่ต้องใช้ตัวดัดแปลงใน regex ของฉัน
ตัวอย่างด้านบนควรทำงานได้ดีกับภาษาเช่น PHP, Perl, Java ... Javascript แต่ไม่สนับสนุน lookbehind ดังนั้นเราต้องลืมเกี่ยวกับการใช้งาน(?<=(<pre>))
และค้นหาวิธีแก้ปัญหาบางอย่าง อาจจะง่าย ๆ ตัดตัวอักษรสี่ตัวแรกออกจากผลลัพธ์ของเราสำหรับการเลือกแต่ละรายการเช่นที่นี่
Regex จับคู่ข้อความระหว่างแท็ก
ดูที่JAVASCRIPT REGEX DOCUMENTATIONสำหรับวงเล็บที่ไม่ได้ถ่าย
ใช้รูปแบบด้านล่างเพื่อรับเนื้อหาระหว่างองค์ประกอบ แทนที่[tag]
ด้วยองค์ประกอบจริงที่คุณต้องการดึงเนื้อหาออกมา
<[tag]>(.+?)</[tag]>
บางครั้งแท็กจะมีแอตทริบิวต์เช่นใช้anchor
แท็กhref
แล้วใช้รูปแบบด้านล่าง
<[tag][^>]*>(.+?)</[tag]>
<[tag]>
จะตรงกับ<t>
, <a>
และ<g>
Replace [tag] with the actual element you wish to extract the content from
ส่วนนี้ไป
[]
ควรถูกตัดออกไปโดยสิ้นเชิง ที่จะมีความชัดเจนมากขึ้นเพราะความหมายของพวกเขาใน RegEx และความจริงที่ว่าคนสแกนรหัสแรกและอ่านข้อความหลังจาก;)
หากต้องการยกเว้นแท็กที่คั่นให้ทำดังนี้
(?<=<pre>)(.*?)(?=</pre>)
(?<=<pre>)
ค้นหาข้อความ <pre>
(?=</pre>)
ค้นหาข้อความก่อน </pre>
ผลลัพธ์จะมีข้อความอยู่ภายในpre
แท็ก
คุณไม่ควรพยายามแยก html ด้วย regexes ดูคำถามนี้และวิธีการเปิด
ในคำศัพท์ที่ง่ายที่สุด html ไม่ใช่ภาษาปกติดังนั้นคุณจึงไม่สามารถแยกวิเคราะห์ได้ทั้งหมดคือใช้นิพจน์ทั่วไป
ต้องบอกว่าคุณสามารถแยกชุดย่อยของ html เมื่อไม่มีแท็กที่ซ้อนกันคล้ายกัน ดังนั้นตราบใดที่สิ่งใดระหว่างและไม่ใช่แท็กนั้นสิ่งนี้จะทำงาน:
preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )
ความคิดที่ดีกว่าคือใช้ parser เช่น DOMDocument ดั้งเดิมเพื่อโหลด html ของคุณจากนั้นเลือกแท็กของคุณและรับ html ภายในซึ่งอาจมีลักษณะดังนี้:
$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName('el');
$value = $obj -> nodeValue();
และเนื่องจากเป็นตัวแยกวิเคราะห์ที่เหมาะสมจึงจะสามารถจัดการแท็กการทำรังเป็นต้น
php
คำถามที่ไม่ได้ติดแท็กด้วย ไม่แน่ใจว่า PHP มาในภาพ ...
ลองสิ่งนี้ ....
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
นี่น่าจะเป็นการแสดงออกที่ธรรมดาที่สุดของสิ่งที่ฉันพบ
(?:<TAG>)([\s\S]*)(?:<\/TAG>)
(?:<TAG>)
จากการแข่งขัน([\s\S]*)
ในการแข่งขัน(?:<\/TAG>)
จากรายการที่ตรงกันคำตอบนี้ไม่สนับสนุนการมองไปรอบ ๆ ! สิ่งนี้ทำให้ฉันสามารถระบุข้อความทั้งหมดระหว่างคู่ของแท็กเปิดและปิด นั่นคือข้อความทั้งหมดระหว่าง '>' และ '<' มันใช้งานได้เพราะการมองไปรอบ ๆ ไม่ใช้ตัวละครที่ตรงกัน
(? <=>) ([w \ \ s] +) (? = </)
ฉันทดสอบในhttps://regex101.com/โดยใช้ส่วน HTML นี้
<table>
<tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3</td></tr>
<tr><td>Cell 4</td><td>Cell 5</td><td>Cell 6</td></tr>
</table>
มันเป็นเกมสามส่วน: การมองไปข้างหลังเนื้อหาและการมองไปข้างหน้า
(?<=>) # look behind (but don't consume/capture) for a '>'
([\w\s]+) # capture/consume any combination of alpha/numeric/whitespace
(?=<\/) # look ahead (but don't consume/capture) for a '</'
ฉันหวังว่าจะทำหน้าที่เป็นการเริ่มต้นสำหรับ 10. โชค
var str = "Lorem ipsum <pre>text 1</pre> Lorem ipsum <pre>text 2</pre>";
str.replace(/<pre>(.*?)<\/pre>/g, function(match, g1) { console.log(g1); });
เนื่องจากคำตอบที่ยอมรับคือไม่มีรหัสจาวาสคริปต์ดังนั้นให้เพิ่ม:
preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)
regex นี้จะเลือกทุกอย่างระหว่างแท็ก ไม่ว่าจะอยู่ในบรรทัดใหม่ (ทำงานกับ multiline
ใน Python การตั้งค่าDOTALL
สถานะจะจับทุกอย่างรวมถึงการขึ้นบรรทัดใหม่
หากระบุค่าสถานะ DOTALL สิ่งนี้จะจับคู่อักขระใด ๆ รวมถึงการขึ้นบรรทัดใหม่ docs.python.org
#example.py using Python 3.7.4
import re
str="""Everything is awesome! <pre>Hello,
World!
</pre>
"""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
pattern = re.compile(r"<pre>(.*)</pre>",re.DOTALL)
matches = pattern.search(str)
print(matches.group(1))
python example.py
Hello,
World!
ในการจับภาพข้อความระหว่างแท็กเปิดและแท็กปิดทั้งหมดในเอกสารfinditer
จะมีประโยชน์ ในตัวอย่างด้านล่าง<pre>
แท็กเปิดและปิดสามแท็กมีอยู่ในสตริง
#example2.py using Python 3.7.4
import re
# str contains three <pre>...</pre> tags
str = """In two different ex-
periments, the authors had subjects chat and solve the <pre>Desert Survival Problem</pre> with a
humorous or non-humorous computer. In both experiments the computer made pre-
programmed comments, but in study 1 subjects were led to believe they were interact-
ing with another person. In the <pre>humor conditions</pre> subjects received a number of funny
comments, for instance: “The mirror is probably too small to be used as a signaling
device to alert rescue teams to your location. Rank it lower. (On the other hand, it
offers <pre>endless opportunity for self-reflection</pre>)”."""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
# The question mark in (.*?) indicates non greedy matching.
pattern = re.compile(r"<pre>(.*?)</pre>",re.DOTALL)
matches = pattern.finditer(str)
for i,match in enumerate(matches):
print(f"tag {i}: ",match.group(1))
python example2.py
tag 0: Desert Survival Problem
tag 1: humor conditions
tag 2: endless opportunity for self-reflection
สำหรับหลายบรรทัด:
<htmltag>(.+)((\s)+(.+))+</htmltag>
คุณสามารถใช้ได้ Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
ฉันใช้วิธีนี้:
preg_match_all( '/<((?!<)(.|\n))*?\>/si', $content, $new);
var_dump($new);
ใน Javascript (รวมถึงอื่น ๆ ) นี่เป็นเรื่องง่าย ครอบคลุมคุณลักษณะและหลายบรรทัด:
/<pre[^>]*>([\s\S]*?)<\/pre>/
<pre>([\r\n\s]*(?!<\w+.*[\/]*>).*[\r\n\s]*|\s*[\r\n\s]*)<code\s+(?:class="(\w+|\w+\s*.+)")>(((?!<\/code>)[\s\S])*)<\/code>[\r\n\s]*((?!<\w+.*[\/]*>).*|\s*)[\r\n\s]*<\/pre>