【问题标题】:PHP string challengePHP字符串挑战
【发布时间】:2014-09-21 21:20:57
【问题描述】:

我有一个字符串,例如

$string = "This is my test string {ABC}. This is test {XYZ}. I am new for PHP {PHP}".

现在我需要替换 {} 中出现的字符串,这样输出将是:

This is my test string {ABC 1}. This is test {XYZ 2}. I am new for PHP {PHP 3}".

我希望用递归函数解决这个问题,但没有得到预期的结果。

【问题讨论】:

  • 你能给出你当前的递归尝试吗?
  • 为什么要递归?和这个问题有什么关系?
  • 如果你要使用递归函数,你需要指定{{A}B{C}}{{A 1}B{C 2} 3}(后序),还是{{A 1}B{C 3} 2}(有序)或者{{A 2}B{C 3} 1}(预序) .如果这种情况根本不会发生,那么你真的不需要递归。迭代就绰绰有余了

标签: php string recursion


【解决方案1】:
$i = 1;
echo preg_replace_callback('/\{(.+?)\}/', function (array $match) use (&$i) {
    return sprintf('{%s %d}', $match[1], $i++);
}, $string);

“诀窍”是简单地保持外部计数器运行,此处为$i,通过use (&$i) 用于匿名回调。

【讨论】:

    【解决方案2】:

    这里没有递归。只是数数。

    $result = preg_replace_callback("/\{([^}]*+)\}/",function($m) {
        static $count = 0;
        $count++;
        return "{".$m[1]." ".$count."}";
    },$string);
    

    【讨论】:

    • 请注意,static 的问题是即使多次调用此代码,计数也会保持不变。即,如果您在循环中执行此操作,则下一个字符串将返回 {ABC 4} {XYZ 5} 等。
    • @deceze 确实。感谢您指出了这一点。虽然,我们不知道,但这可能是期望的行为 XD
    【解决方案3】:

    如果你真的需要递归:^)

    $string = "This is my test string {ABC}. This is test {XYZ}. I am new for PHP {PHP}";
    
    function my_replace($string, $count = 1)
        {
        if ($string)
            {
            return preg_replace_callback('/\{(.+?)\}(.*)$/', function (array $match) use ($count)
                {
                return sprintf('{%s %d} %s', $match[1], $count, my_replace($match[2], $count + 1));
                }, $string, 1);
            }
        }
    echo my_replace($string);
    

    【讨论】:

    • 嗯,不错。我想……?
    • 但是你的牙套太疯狂了。 ;-P
    • @deceze,只是对您的答案进行了一些修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    • 2012-06-29
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多