У меня есть необходимость заменить 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;"
Или я только добьюсь этого с помощью цикла?
Вы можете использовать либо
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>
в случае нечувствительным образом во время захвата каждой метки на своем пути (сохраняя последнее значение в группе beffer после последнего его и "$&$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;
Здесь (?:<br\s*\/?>)+
также будет соответствовать 1 или более <br>
но без захвата каждого вхождения, так и внутри обратного вызова, все <br>
получите нормированы <BR/>
и к результату <BR/>
.
Вы можете использовать негативный взгляд вперед (<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);
<BR/>
в замене? Разве вы не хотите просто добавить тот же самыйbr
который использовался последним в последовательности? Я только что попробовал и получилtext<BR><BR><BR>text text<BR><BR>text;