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);

代替は、行末(number)の a または a 以外の何かに一致します。)行が で終わっていない場合は、)を追加する必要があり(1)ます。

于 2013-09-11T02:24:05.483 に答える
0

最後の一致が必要なので、preg_match() の代わりに preg_match_all() を使用します。これにより、前述のような関数を使用する準備が整いますが、括弧を取り除いて 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 に答える