preg_replace (): & quot; не строгое & quot; замена

У меня есть строка $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()Любая помощь будет полезна.

0

Решение

Как предлагается в комментариях, preg_replace_callback позволяет выполнять код для сопоставленного текста, аналогично PCRE e флаг:

$content = preg_replace_callback(
"/(\d+)px/",
function($g) {
$val = $g[1] * 2.6978417266187051;
return $val . "px";
}, $content
);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]