Хотя сочетание фраз "регулярное выражение" и "синтаксический анализ HTML" обычно приводит к разрушению целых вселенных , ваш вариант использования выглядит достаточно упрощенным, чтобы он мог работать, но тот факт, что вы хотите сохранить Форматирование HTML после переноса упрощает работу с последовательностью, разделенной пробелами. Вот очень грубое приближение того, что вы хотели бы сделать:
input = "<b>Hello</b> Here is some code that I would like to wrap. Let's pretend this goes on for over 70 spaces. Better ¥€±, let's <em>make</em> it go on for more than 70, and pick üþ a whole <strong>buñ©h</strong> of crazy symbols along the way.";
words = input.split(' ');
lengths = [];
for (var i = 0; i < words.length; i++)
lengths.push(words[i].replace(/<.+>/g, '').replace(/&.+;/g, ' ').length);
line = [], offset = 0, output = [];
for (var i = 0; i < words.length; i ++) {
if (offset + (lengths[i] + line.length - 1) < 70) {
line.push(words[i]);
offset += lengths[i];
}
else {
output.push(line.join(' '));
offset = 0; line = [], i -= 1;;
}
if (i == words.length - 1)
output.push(line.join(' '));
}
output = output.join('<br />');
, что приводит к
Hello Here is some code that I would like to wrap. Let's pretend this
goes on for over 70 spaces. Better ¥€±, let's make it go on for more
than 70, and pick üþ a whole buñ©h of crazy symbols along the way.
Обратите внимание, что теги HTML (b
, em
, strong
) сохраняются, просто уценка не показывает их.
По сути, входная строка разбивается на слова в каждом пробеле, что наивно и может вызвать проблемы, но это начало. Затем длина каждого слова вычисляется после удаления чего-либо, напоминающего HTML-тег или объект. Тогда нужно просто перебирать каждое слово, вести подсчет столбца, в котором мы находимся; Как только мы достигли 70, мы вставляем агрегированные слова в выходную строку и сбрасываем. Опять же, это очень грубо, но этого должно хватить для большинства базовых HTML.