我需要将HTML字符串的内容从一个<br>
替换为两个。但是我无法实现的是当我有一个标签跟随另一个标签时:
(<br\s*\/?>)
将匹配此文本中的所有标记:
var text = 'text<BR><BR>text text<BR>text;'
将匹配并且替换我将
text = text.replace.replace(/(<br\s*\/?>)>/gi, "<BR\/><BR\/>")
console.log(text); //text<BR/><BR/><BR/><BR/>text text<BR/><BR/>text;"
有没有办法只用正则表达式增加一个标签?并实现这一点:
console.log(text); //text<BR/><BR/><BR/>text text<BR/><BR/>text;"
或者我只会通过循环实现这一目标?
答案 0 :(得分:2)
您可以使用
var text = 'text<BR><BR>text text<BR>text;'
text = text.replace(/(<br\s*\/?>)+/gi, "$&$1");
console.log(text); // => text<BR><BR><BR>text text<BR><BR>text;
在这里,(<br\s*\/?>)+/gi
以不区分大小写的方式匹配1个或多个<br>
序列,同时捕获每个标记的路径(保持最后一个值之后的组中的最后一个值,并且{ {1}}将替换为整个匹配("$&$1"
),并将$&
与<br>
一起添加。
或者
$1
此处,var text = 'text<BR><BR>text text<BR>text;'
text = text.replace(/(?:<br\s*\/?>)+/gi, function ($0) {
return $0.replace(/<br\s*\/?>/gi, "<BR/>") + "<BR/>";
})
console.log(text); // => text<BR/><BR/><BR/>text text<BR/><BR/>text;
也会匹配1个或多个(?:<br\s*\/?>)+
,但不会捕获每个匹配项,并且在回调中,所有<br>
都会标准化为<br>
并且<BR/>
将附加到结果中。
答案 1 :(得分:0)
如果有任何连续的话,你可以使用负向前看(<br\s*\/?>)(?!<br\s*\/?>)/
来仅增加最后一个标签:
var text = 'text<BR><BR>text text<BR>text;'
text = text.replace(/(<br\s*\/?>)(?!<br\s*\/?>)/gi, "<BR\/><BR\/>")
console.log(text);
&#13;