簡體   English   中英

Javascript RegEx匹配HTML標簽內的字符串

[英]Javascript RegEx matching a string inside HTML tags

我這里的情況很奇怪。 我有一個看起來像這樣的字符串:

<tag&nbsp;class="bla">hey&nbsp;there&nbsp;</tag>

我必須使用javascript替換所有&nbsp; 包含在HTML標記內,並帶有空格。 可以有任意數量的標簽和&nbsp; 因此它必須看起來像這樣:

<tag class="bla">hey&nbsp;there&nbsp;</tag>

在此先感謝亞瑟。

可能不是最有效的,但應該執行以下工作:

str.replace(/<([^>]+)>/g, function(m){ return m.replace(/&nbsp;/gi, ' '); });

哪個應該只能觸摸&nbsp; <>內部

首先,讓我們再次聲明,使用正則表達式解析(X)HTML是正確的答案時,這可能是因為問題被嚴重搞砸了。 在這種情況下,您應該讓生成損壞的HTML的人讓他放鼻子,然后讓他修復混亂。

否則,它將成為您的工作,並且對任何進一步的混亂承擔責任。

就是說,也許最安全的方法是尋找

<([^<>]*)&nbsp;([^<>]*)>

並將其替換為<\\1 \\2> 這種方法的缺點是您必須重復執行此操作(如果您的標簽內部有八個&nbsp; ;,則必須將替換操作重復八次)。

因此,您還需要一個執行替換的循環,如果替換后的文本與之前的文本相同,則說明您已完成並可能退出循環。

就替換速度而言,這不是最有效的方法,但是它更直接,更容易處理。 它還有助於記住這是一個麻煩的解決方法:-)

在這種特殊情況下,可以通過修改外部表達式來解決RoToRa注釋中描述的問題:

<(\w[^<>]*)&nbsp;([^<>]*)>

因此它只接受以字母開頭的標簽。 1 < 2 &nbsp; > 3 1 < 2 &nbsp; > 3則被拒絕。

相同的“解決方案”適用於Ross McLellan的解決方案:

str.replace(/<(\w[^>]+)>/g, function(m){ return m.replace(/&nbsp;/gi, ' '); });

出於性能方面的考慮,Ross的解決方案在較小的HTML塊上速度更快,並且在標記數量增加時落后於我的解決方案。 那是因為我的解決方案的搜索開銷略大,但是我的發現要少得多的匹配,並且實際上進行了更少的replace()調用。

此修改可能會兼得兩全,但我尚未對其進行測試:

str.replace(/<(\w[^<>]*&nbsp;[^<>]*)>/g,
    function(m) {
        return m.replace(/&nbsp;/gi, ' ');
    }
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM