我作業的一些HTML檔案,我想一個匹配<p>標簽的內<li>內<ul>
例如:
<ul>
<li>1</li>
<li><p>2</p></li>
<li>
<ul>
<li><p>3</p></li>
</ul>
</li>
</ul>
我的目標是將兩個<p>標簽(2 和 3)分別與它們最近的父標簽<li>和<ul>標簽匹配。
這是我正在使用的正則運算式
/<ul>.*?(<li.*?>).*?(<p.*?>.*?<\/p>)(.*?)(<\/li>)/gs
當我嘗試在這樣的 html 中匹配時出現問題:
<ul>
<li>
<ul>
<li></li>
<p>4</p>
</ul>
</li>
</ul>
它匹配<p>標簽和更遠的父<li>和<ul>標簽。
有誰知道我該如何解決這個問題?
編輯:假設我需要使用 Regex 進行此匹配。無論如何,我最終可能會像你們建議的那樣在 JS 中使用選擇器,但我仍然想知道是否有針對此模式的簡單修復,因為使用 Regex 的應用程式中已經存在此邏輯。
uj5u.com熱心網友回復:
如果您的目標是修復/查找錯誤的 HTML?即<p>作為直系后代<ul>是不允許的;因此正則運算式,更好的方法可能是一個簡單的決議器。
如果不; 最簡單的將是類似document.createElement innerHTML querySelectorAll。
如果使用 RegExp在匹配標簽時使用否定<>作為“分隔符”,即:
<foo[^>]*>
// and
[^<]*
雖然顯然不是萬無一失的。您的情況下又快又臟:
/<ul>[^<]*<li[^>]*>[^<]*<p[^>]*>([^<]*)/
| | |
| | -- ...
| -- not >
-- not <
會與內部的標簽崩潰<p>(即僅取決于內部的文本<p> ... </p>)。
uj5u.com熱心網友回復:
這是部分答案。
我得到的最好的是 /<ul>.*?(<li.*?>(?:(?!<li>).)*?<p.*?>.*?<\/p>(?:(?!<\/li>).)*<\/li>)/gs
和
<ul>
<li>1</li>
<li><p>2</p></li>
<li>
<ul>
<li><p>3</p></li>
</ul>
</li>
</ul>
它給出(第一個顯然是錯誤的)
<li>1</li> <li><p>2</p></li> 和 <li><p>3</p></li>
和
<ul>
<li>
<ul>
<li></li>
<p>4</p>
</ul>
</li>
</ul>
結果是
<li>
<ul>
<li></li>
<p>4</p>
</ul>
</li>
也許有人可以進一步改進它
uj5u.com熱心網友回復:
您已被警告在評論中使用帶有 HTML 的正則運算式。
他們是正確的,層次結構意味著線性模式并不總能找到您想要的解決方案。
使用有效的 HTML
假設 HTML 無論如何都是有效的,并且您要查找的標簽之間只有空格,我想出了這個:
\s*(<li.*>)?\s*(<p.*>.*<\/p>)\s*(<\/li>)?
- 這使得周圍的
li元素是可選的,但如果它存在(至少在你的例子中),它仍然會捕獲它。 - 假設其他地方都有空格,所以
\s* - 我已經替換
.*?為.*:你不必寫.*?,*已經表示“0 或更多”。
您可以在此處進行試驗:https :
//regex101.com/r/oyNweY/1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/381584.html
標籤:javascript 正则表达式
上一篇:使用陣列陣列中的子項創建嵌套物件
下一篇:for回圈神秘地沒有運行
