【问题标题】:Replace multiple items in string using cases/switch in PHP在 PHP 中使用 case/switch 替换字符串中的多个项目
【发布时间】:2013-10-05 01:16:02
【问题描述】:

我正在尝试做一些事情,从数据库中获取一个长字符串,并替换可能的标签,如 [timeYEAR] [timeMONTH] [timeDAY] - 基本上是 [] 中的任何内容,然后根据案例或开关替换它项目与其他东西。

例如将 [timeYEAR] 替换为 2013。

但我不想为每个可能的情况创建一个函数。

有什么想法吗?

提前致谢!

【问题讨论】:

  • 你用什么替换标签?这个价值从何而来?
  • 使用str_replace()。您可以为其提供原始字符串和替换字符串的数组,它会一口气完成所有操作。

标签: php string switch-statement


【解决方案1】:

如果您想做一些更动态的事情(不区分大小写的匹配,允许time{time_unit} 之间有多个空格等),您可以使用preg_replace_callback 完成类似的事情。

<?php
$res = preg_replace_callback('/\[time(?P<type>[^\]]+)\]/ui', function ($matches) {
    switch (trim(strtolower($matches['type']))) {
        case 'year':
            return date('Y');
            break;
        case 'month':
            return date('F');
            break;
        case 'day':
            return date('j');
            break;
        default:
            return $matches[0];
            break;
    }
}, '[timemonth] [timeday], [timeyear] [timenope]');

如果不需要更动态,strtr 可能会快一些。

<?php
$res = strtr('[timeMONTH] [timeDAY], [timeYEAR]', array(
    '[timeMONTH]'  => date('F'),
    '[timeDAY]'    => date('j'),
    '[timeYEAR]'   => date('Y'),
));

date 调用替换为您的值的来源。

【讨论】:

  • 谢谢!正是我正在寻找的。我刚刚将时间从 '/[time(?P[^]]+)]/ui' 删除到 '/[(?P[^]]+)]/ui' 所以我可以使用没有时间相关的键。你觉得这样可以吗?
  • 嘿,我对此还有另一个问题。如果我想通过标签传递一些数据(变量)怎么办? [tagName:variableInfo] -- 这可能吗?
  • 当然可以,但您必须使用preg_replace_callback。然后用冒号explode(':', $matches['type']) 分割$matches['type'] 字符串,然后做你需要做的事情。这有点简单,但你明白了。您只需要匹配方括号中包含的任何内容,如上所示。在回调函数中做任何你需要的进一步处理。
  • @chrisguitarguy- 但是由于变量更改了标签,回调将如何检测标签。就像一个可能是 [tagName:variable1] 而另一个可能是 [tagName:variable2]
  • $parts = explode($matches['type']); $tag_name = array_shift($parts); 然后随意使用$parts 的其余部分。
猜你喜欢
  • 2012-05-01
  • 2011-06-23
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 2019-09-03
  • 2018-07-28
  • 1970-01-01
相关资源
最近更新 更多