【问题标题】:How to return matches array and also result string using preg_replace?如何使用 preg_replace 返回匹配数组和结果字符串?
【发布时间】:2017-05-26 12:46:49
【问题描述】:

我需要完成两件事,我想知道是否可以使用 preg_replace 完成这两件事。

我需要修改一个字符串。现在我正在使用 preg_replace:

preg_replace($terms,$replace_with,$string,1);

其中 $terms 是一个术语数组,而 $replace_with 也是一个数组。

但是我还需要在单独的数组中返回匹配项(以便稍后更新其他值),因为有几个术语,我不知道匹配了哪个。

我知道如何做到这一点的唯一方法是先运行 preg_match,它默认返回匹配数组,然后 preg_replace 用新值实际替换字符串。

有没有办法返回字符串,并且只与 preg_replace 匹配?

我的最终目标是修改后的 $string(目前是通过 preg_replace 完成的),以及一个匹配 $terms 的数组。

【问题讨论】:

  • 我做了,但我不明白这有什么帮助。我不想对匹配进行分组并用它们替换字符串。我需要类似于从 preg_match 返回的 $matches 数组的东西,这样我就可以在 preg_replace 之外使用它。你能给我举个例子吗?
  • $replace_with 是数组还是字符串?
  • 可能是 preg_match_all(),然后是 str_replace() 与匹配项。
  • $replace_with 也是一个数组。

标签: php arrays


【解决方案1】:

没有,但如果$terms$replace_with 有数字键(没有空格),你可以使用preg_replace_callback

$matches = [];
foreach($terms as $k=>$term) {
    $rep = $replace_with[$k];
    $string = preg_replace_callback($term, function ($m) use ($rep, &$matches) {
        $matches[] = $m[0];
        return $rep;
    }, $string, 1);
}

请注意,使用foreach + preg_replace[_callback] 与使用preg_replace 将数组作为第一个参数或使用preg_replace_callback_array 完全相同。 (即:字符串被逐项解析一次。)

【讨论】:

  • 谢谢。我会试试这个。我之前研究过 preg_replace_callback 但我想确保我没有错过一些 preg_replace 选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2019-09-03
相关资源
最近更新 更多