0

我有这样的字符串

Foo(2)moreFoo (1)
Foo(1)moreFoo (2)
Foo(99)moreFoo (3)
Foo(99)moreFoo (9)
Foo

我需要获取每个字符串,并更改最后一个(number)

所以,在这种情况下,我想为每个字符串获取:

Foo(2)moreFoo (2)
Foo(1)moreFoo (3)
Foo(99)moreFoo (4)
Foo(99)moreFoo (10)
Foo(1)

这就像获取字符串,获取最后一次出现的(number),并将其替换为(number +1)

我怎样才能做到这一点?

我已经检查了这个答案,但不知道如何更改它。

我开始了

$subject = 'Foo (2)(1)';

if(preg_match('\([0-9]+\)', $subject))
{   
    $pos = strrpos($subject, '\([0-9]+\)');

    if($pos !== false)
    {
        $subject = substr_replace($subject, $replace, $pos, strlen($search));
    }
}

但问题是数字可能是 (10) 所以,我不能只得到最后 3 个字符。

(number)如果存在,将在结尾。它可能在中间,但有趣的是在最后。

4

2 回答 2

1

您可以使用preg_replace_callback()来定位单个匹配项并替换它们:

echo preg_replace_callback('/\((\d+)\)$/m', function($match) {
    return '(' . ++$match[1] . ')';
}, $subject);

该模式匹配每行末尾带括号的数字,并调用匿名函数来执行替换。它$/m 修饰符结合使用来匹配每一行的结尾。

匹配没有任何(number)你需要一个有点棘手的表达式的行:

echo preg_replace_callback('/(?:\((\d+)\)|([^)]))$/m', function($match) {
    return isset($match[2]) ? "{$match[2]}(1)" : '(' . ++$match[1] . ')';
}, $subject);

交替匹配行尾的 a(number)或非 a)的内容。如果该行没有以)我们应该添加(1).

于 2013-09-11T02:24:05.483 回答
0

您将使用 preg_match_all() 而不是 preg_match() 因为我们想要最后一场比赛。这将使您准备好使用您提到的功能,但您仍然需要剥离括号并添加 1。

$subject = 'Foo (2)(1)';

echo $subject,"<br />";

if(preg_match_all('/\([0-9]+\)/', $subject, $matches))
{   
    $last_match =  $matches[0][count($matches[0])-1];
    $pos = strrpos($subject, $last_match);

    echo $pos;
    if($pos !== false)
    {
        $subject = substr_replace($subject, $replace, $pos, strlen($search));
    }
}
于 2013-09-11T02:41:25.287 回答