Замена символов в тексте с помощью цикла и регулярного выражения
Пример того, как заменить отдельные символы в тексте с помощью регулярного выражения и самодельного цикла с подстановкой
Суть задачи: есть полноценный контент, завернутый в теги. Произвольно заданы стили, в том числе font-size, выраженный в px. Нужно пиксели заменить на em из расчёта 1em = 18px.
Решение с помощью цикла:
var content = data.content,
pattern = "font-size:",
_content = content,
leftPart = "",
pixels = "";
if (!content) break;
for (var k = 0; k < 100; k++) {
var a = _content.indexOf(pattern);
if (a == -1) break;
// часть строки до font-size
leftPart = leftPart + _content.slice(0, a);
_content = _content.slice(a + 10);
var b = _content.indexOf("px");
if (b > -1) {
// шрифт в пикселях
pixels = _content.slice(_content, b);
// оставшийся хвост контента после записи "px"
_content = _content.slice(b + 2);
// пересчитываем в em
pixels = pixels / 18;
leftPart = leftPart + "font-size:" + pixels + "em";
content = leftPart + _content;
}
}
actualData = content;
Произвольное количество итераций цикла 100 выбрано с запасом. Предполагается, что вероятность того, что пользователь системы более 100 раз в сообщении укажет font-size, стремится к нулю.
С помощью регулярного выражения замена происходит так:
var content = data.content,
// регулярка для поиска записей типа "14px"
pattern = /(\d+(?:\.\d*)?)px\b/g,
// функция пересчёта
convert = function(str, p1, offset, s) {
return (parseInt(p1, 10) / 18 + "em");
}
actualData = content.replace(pattern, convert);
Разница в производительности следующая.
Для замены 100 случаев записей вида “Npx” в тексте на записи вида “Nem” циклу потребовалось 2мс, регулярке 1мс.