preg_replace():“非严格”替换

时间:2016-06-30 16:36:17

标签: php regex preg-replace string-parsing

我有一些字符串$content,其中包含一些px-metrics("<div class="predefined" data-key="name" style="z-index: 1000; position: absolute; max-width: 556px; width: 556px;...")。我需要将每个找到的指标乘以某个数字。

我决定使用preg_replace()

1)对于第一个参数 - 模式 - 我解析了字符串并获得了$patterns数组,其中包含字符串中的所有px-metrics;之后添加了每个元素分隔符"/"

$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 - 应该是来自$ patterns的每个度量,乘以一些num(在这种情况下,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 !我明白了,为什么会这样:

2 20px 不是由第15个元素替换,而是由元素[11]替换( 2 20px =&gt; 2 +替换为元素[11] =&gt; 2 53.956834532374px )。

我该怎么办?我的注册<{1}}中的表达式不在括号中,因此我等待严格比较。

如果无法解决,我可以使用完全另一种方法来更改字符串中的指标,而不是完全通过$patterns,任何帮助都会有用。

1 个答案:

答案 0 :(得分:1)

根据评论中的建议,preg_replace_callback允许您在匹配的文本上执行代码,类似于PCRE的e标记:

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