【问题标题】:How to preg_match_all() + extract + replace + delete?如何 preg_match_all() + 提取 + 替换 + 删除?
【发布时间】:2012-07-02 16:12:53
【问题描述】:

我对 preg_match_all 和类似的东西不是很有经验,我正在寻找一种简单的方法来执行以下操作:

考虑一下这段文字:

$string = 'This text was written on [set_stamp]1341066037[/set_stamp] and this one on [set_stamp]1340903119[/set_stamp].';

我需要做什么:

  1. 获取所有标签[set_stamp][/set_stamp]之间的数据(这里是时间戳)
  2. 将所有捕获的时间戳替换为其对应的日期,例如:date('Y-m-d H:i:s', $timestamp)
  3. 删除所有[set_stamp][/set_stamp] 标签

最终的输出会是这样的:

“这篇文章写于 2012-07-12 14:26,这篇文章写于 2012-07-11 17:10。”

【问题讨论】:

    标签: php preg-replace preg-match-all str-replace


    【解决方案1】:

    您可以将preg_replace_callback() 与以下正则表达式一起使用:

    #\[set_stamp\](.+)\[/set_stamp\]#iU
    

    示例代码:

    $string = 'This text was written on [set_stamp]1341066037[/set_stamp] and this one on [set_stamp]1340903119[/set_stamp].';
    echo preg_replace_callback('#\[set_stamp\](.+)\[/set_stamp\]#iU', function($m) {
        return date('Y-m-d H:i', $m[1]);
    }, $string);
    

    该代码的输出是:

    这篇文章写于 2012-06-30 16:20,这篇文章写于 2012-06-28 19:05。

    请注意,匿名函数至少需要 PHP 5.3。如果您使用的是旧版本并且确实无法更新,只需创建一个普通函数并将其名称作为字符串传递即可。

    【讨论】:

    • 非常感谢您的帮助!正是我需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多