我有这样的字符串
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)
(如果存在)将结束。它可能在中间,但有趣的是最终。
答案 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));
}
}