我有这样的字符串
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)
,如果存在,将在末尾。它可能在中间,但有趣的是在最后。
您可以使用
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);
交替匹配(number)
或行尾不是)
的东西。如果该行没有以 )
结尾,我们应该添加 (1)
.
您将使用 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));
}
}