【问题标题】:How to get both resulting text and the replaced items using preg_replace()?如何使用 preg_replace() 获取结果文本和替换项?
【发布时间】:2015-02-03 10:58:29
【问题描述】:

如何在 PHP 中使用 preg_replace()(或任何其他函数)获取结果文本和替换文本?

// Have:
$txt = "Lorem ipsum dolor sit amet, REPLACE_ME consectetur adipiscing elit.";

// Desired result:
$txt == "Lorem ipsum dolor sit amet, WAS_REPLACED consectetur adipiscing elit."
$replaced_text == 'REPLACE_ME'

preg_replace() 似乎返回被替换的部分或结果文本。而${1} vars 在 preg_replace() 调用之后似乎是空的;

EDIT2:得到了一些外部帮助,这是最终版本:

$re = "/REPLACE_ME/i";
$str = "Lorem ipsum dolor sit amet, REPLACE_ME consectetur adipiscing elit.";
$subst = "WAS_REPLACED";

$replacements;

$result = preg_replace_callback(
    $re, 
    function ($matches) use(&$replacements, $subst)  {
        $replacements = $matches[0];
        return $subst;
    },
    $str, 1);

echo $result."\n";
echo $replacements;

【问题讨论】:

  • 我不是 php 开发者,只是想为我的 phpBB 板做一个小模组。
  • 为什么使用双等号?

标签: php regex preg-replace


【解决方案1】:
(REPLACE_ME)

直接用这个。看demo。

https://regex101.com/r/vD5iH9/56

$re = "/(REPLACE_ME)/im";
$str = "Lorem ipsum dolor sit amet, REPLACE_ME consectetur adipiscing elit.";
$subst = "WAS_REPLACED";

$result = preg_replace($re, $subst, $str);

$1\1 将包含被替换的文本。

编辑:要获得Replaced content,您可以使用它。检查数组$matches

$re = "/(REPLACE_ME)/im";
$str = "Lorem ipsum dolor sit amet, REPLACE_ME consectetur adipiscing elit.";

preg_match_all($re, $str, $matches);

【讨论】:

  • $result 将被修改为$str。但我仍然没有任何包含匹配文本的变量(在此示例中为REPLACE_ME;认为模式很复杂)。对我来说只获得第一场比赛就足够了,所以你可以添加1 作为第四个参数。
  • 抱歉,在您编辑之前看到了。如何在下一行访问$1?简单的$r = $1; 给了我错误。而${1} 为空。
  • @flamey 检查编辑后的代码。猜猜你需要使用match.$matches 数组将包含你想要的内容
  • 感谢@vks。我想我需要先匹配然后替换。我在想我错过了一些东西,你可以像在 Perl 中那样做事情。实际上,我确实想出了带有回调的解决方案(请参阅我的编辑),但这不是一个优雅的解决方案。当然,首先获得匹配然后替换会更容易。
  • 工作人员向我解释了如何在没有golbals 的情况下做到这一点。它适用于 5.3+ 版本,这很好。查看新的编辑
【解决方案2】:

试试这个。

$txt = "Lorem ipsumdolor sit amet REPLACE_ME consectetur adipiscing elit.";
$replaced_text=preg_replace("/REPLACE_ME/","REPLACED_TEXT",$txt);

如果成功找到并替换了文本,则给定的变量将填充所需的输出。

【讨论】:

  • 是的,但我还需要另一个带有匹配文本的变量(考虑 $replaced_text 是更复杂的正则表达式模式)
  • 你到底想说什么?上面的代码你试过了吗?
【解决方案3】:

将变量放在使用. 运算符连接的php 分隔符内。

$txt = "Lorem ipsum dolor sit amet, REPLACE_ME consectetur adipiscing elit.";
$text_to_replace = 'REPLACE_ME';
$replaced_text = 'WAS_REPLACED';
echo preg_replace('~'.$text_to_replace.'~', $replaced_text, $txt);

输出:

Lorem ipsum dolor sit amet, WAS_REPLACED consectetur adipiscing elit.

【讨论】:

  • @flamey 看到我的更新。它也适用于复杂的模式。发布上面的代码会失败。
猜你喜欢
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2011-01-24
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
相关资源
最近更新 更多