preg_replace(): "non-strict" 替换
preg_replace(): "non-strict" replacement
我有一些字符串 $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!我明白了,为什么会这样:
220px 不是被第 15 个元素替换,而是被元素 [11] 部分替换(2 20px => 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
);
我有一些字符串 $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!我明白了,为什么会这样:
220px 不是被第 15 个元素替换,而是被元素 [11] 部分替换(2 20px => 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
);