Замена символов в тексте с помощью цикла и регулярного выражения

Пример того, как заменить отдельные символы в тексте с помощью регулярного выражения и самодельного цикла с подстановкой

Суть задачи: есть полноценный контент, завернутый в теги. Произвольно заданы стили, в том числе 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мс.

Теги: