获取最后一次出现的String,作为数字,并替换它

时间:2013-09-11 02:15:32

标签: php regex string php-5.3

我有这样的字符串

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)

我该怎么做?

我已经检查了this answer,但不确定如何更改它。

我已经开始了

$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)(如果存在)将结束。它可能在中间,但有趣的是最终。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

交替匹配(number)或行末不是)的内容。如果该行未以)结尾,我们应添加(1)

答案 1 :(得分:0)

你将使用preg_match_all()而不是preg_match(),因为我们想要最后一场比赛。这将让你准备好使用你提到的功能,但你仍然需要剥离parens并添加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));
    }
}