У меня есть html, что я готов вставить в dom. Прежде чем я это сделаю, мне нужно вставить тег каждые 30 символов. Это очень легко сделать примерно так:
var html = html.replace(/(.{30})/g, '$1<wbr>');
Однако это простое решение часто вставляет тег в существующий тег html. Например, это может закончиться:
<spa<wbr>n> Some text here </span>
В html может быть много детей так:
<div>
This is some text that we need to treat. <br />
<span> Here is some more text. <a href="#"> Click here. </a> </span>
</div>
Какой лучший способ приблизиться к этому? Является ли regex возможным решением? Или мне нужно написать функцию javascript? Я надеялся, что смогу выяснить, как написать регулярное выражение, подобное приведенному выше, которое вставляет текст в каждое n символов, ЕСЛИ оно не должно быть между символами "<" и ">".
Любая помощь приветствуется.
Вот мое решение. Обычно я не хотел бы использовать jquery, но время имеет значение.
var el = $('<div>' + html + '</div>');
var allChildren = el.find('*');
allChildren.each(function() {
for(var i = 0, len = this.childNodes.length; i < len; i++) {
if(this.childNodes[i].nodeType === 3) {
var newHtml = this.childNodes[i].nodeValue.replace(/(.{30})/g, '$1<wbr>');
$(this.childNodes[i]).replaceWith(newHtml);
}
}
});
html = el.html();
Вы можете использовать это:
(.{30}.*?\s)
Пример рабочего регулярного выражения:
Javascript:
var html = html.replace(/(.{30}.*?\s)/g, '$1<br />');
Так что это будет вставить <br>
метки на следующем ниже месте после 30 - го символа, поэтому <br>
не вставляется внутрь какого - либо слова или меток.
replace
в строке HTML. Просто перетащите все текстовые узлы вашего дерева DOM и разбейте их на части.