У меня есть строка $content
, который содержит некоторые px-метрики ("<div class="predefined" data-key="name" style="z-index: 1000; position: absolute; max-width: 556px; width: 556px;..."
). Мне нужно умножить каждую найденную метрику на некоторое число.
Я решил использовать preg_replace()
:
1) для первого аргумента — шаблоны — я проанализировал строку и получил $patterns
массив со всеми px-метриками в строке; после этого добавляется для каждого элемента разделители "/"
:
$patterns = array (
0 => '/556px/',
1 => '/556px/',
2 => '/40px/',
3 => '/1px/',
4 => '/1px/',
5 => '/556px/',
6 => '/556px/',
7 => '/40px/',
8 => '/1px/',
9 => '/280px/',
10 => '/556px/',
11 => '/20px/',
12 => '/100px/',
13 => '/40px/',
14 => '/220px/',
15 => '/480px/',
);
2) второй аргумент — $replacements
— должна быть каждая метрика из $ шаблонов, умноженная на некоторое число (в данном случае num равно 2.6978417266187051):
$replacements = array (
0 => '1500px',
1 => '1500px',
2 => '107.91366906475px',
3 => '2.6978417266187px',
4 => '2.6978417266187px',
5 => '1500px',
6 => '1500px',
7 => '107.91366906475px',
8 => '2.6978417266187px',
9 => '755.39568345324px',
10 => '1500px',
11 => '53.956834532374px',
12 => '269.78417266187px',
13 => '107.91366906475px',
14 => '593.52517985612px',
15 => '1294.964028777px',
);
3) бегать $content = preg_replace($patterns, $replacements, $content);
Я заметил проблему с элементом [14]. Строка с миром результата:
height: 107.91366906475px; bottom: auto; left: 253.956834532374px; top: 1294.964028777px;">111222</div>
left
, который должен быть 593.52517985612px, является 253.956834532374px! Я вижу, почему это происходит:
220px заменяется не 15-м элементом, а, в частности, элементом [11] (220px => 2 + заменить на элемент [11] => 253.956834532374px).
Что я могу сделать с этим? Мой рег. выражения в $patterns
не в скобках, поэтому я ждал строгого сравнения.
Если это не может быть решено, я могу использовать совершенно другой подход для изменения метрик в строке, а не через preg_replace()
Любая помощь будет полезна.
Как предлагается в комментариях, preg_replace_callback
позволяет выполнять код для сопоставленного текста, аналогично PCRE e
флаг:
$content = preg_replace_callback(
"/(\d+)px/",
function($g) {
$val = $g[1] * 2.6978417266187051;
return $val . "px";
}, $content
);
Других решений пока нет …