PHP preg_replace - 使用匹配作为键从数组中查找替换

发布于 2024-09-09 23:33:07 字数 599 浏览 3 评论 0原文

我有一个字符串,它可以包含多个匹配项(百分号包围的任何单词)和一个替换数组 - 每个替换的关键是正则表达式的匹配。一些代码可能会更好地解释这一点......

$str = "PHP %foo% my %bar% in!";
$rep = array(
  'foo' => 'does',
  'bar' => 'head'
);

期望的结果是:

$str = "PHP does my head in!"

我已经尝试了以下方法,但没有一个起作用:

$res = preg_replace('/\%([a-z_]+)\%/', $rep[$1], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep['$1'], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep[\1], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep['\1'], $str);

因此我向 Stack Overflow 寻求帮助。有接受者吗?

I have a string which can contain multiple matches (any word surrounded by percentage marks) and an array of replacements - they key of each replacement being the match of the regex. Some code will probably explain that better...

$str = "PHP %foo% my %bar% in!";
$rep = array(
  'foo' => 'does',
  'bar' => 'head'
);

The desired result being:

$str = "PHP does my head in!"

I have tried the following, none of which work:

$res = preg_replace('/\%([a-z_]+)\%/', $rep[$1], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep['$1'], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep[\1], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep['\1'], $str);

Thus I turn to Stack Overflow for help. Any takers?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

赠意 2024-09-16 23:33:07
echo preg_replace('/%([a-z_]+)%/e', '$rep["$1"]', $str);

给出:

PHP does my head in!

请参阅修饰符“e”的文档

echo preg_replace('/%([a-z_]+)%/e', '$rep["$1"]', $str);

gives:

PHP does my head in!

See the docs for the modifier 'e'.

可爱咩 2024-09-16 23:33:07

似乎修饰符“e”已被弃用。存在安全问题。
或者,您可以使用 preg_replace_callback。

$res = preg_replace_callback('/\%([a-z_]+)\%/', 
                             function($match) use ($rep) { return  $rep[$match[1]]; },
                             $str );

It seems that the modifier "e" is deprecated. There are security issues.
Alternatively, you can use the preg_replace_callback.

$res = preg_replace_callback('/\%([a-z_]+)\%/', 
                             function($match) use ($rep) { return  $rep[$match[1]]; },
                             $str );
风透绣罗衣 2024-09-16 23:33:07

您可以使用 eval 修饰符...

$res = preg_replace('/\%([a-z_]+)\%/e', "\$rep['$1']", $str);

You could use the eval modifier...

$res = preg_replace('/\%([a-z_]+)\%/e', "\$rep['$1']", $str);
裸钻 2024-09-16 23:33:07

只是为了提供 preg_replace() 的替代方案:

$str = "PHP %foo% my %bar% in!";
$rep = array(
  'foo' => 'does',
  'bar' => 'head'
);


function maskit($val) {
    return '%'.$val.'%';
}

$result = str_replace(array_map('maskit',array_keys($rep)),array_values($rep),$str);
echo $result;

Just to provide an alternative to preg_replace():

$str = "PHP %foo% my %bar% in!";
$rep = array(
  'foo' => 'does',
  'bar' => 'head'
);


function maskit($val) {
    return '%'.$val.'%';
}

$result = str_replace(array_map('maskit',array_keys($rep)),array_values($rep),$str);
echo $result;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文