0

PHPの文字列内の隣接する文字と一致する正規表現パターンを探しています。

たとえば、文字列「1234」がある場合、それを一致させて返します

1
12
123
1234

これはphpの正規表現で可能ですか?

私はもう試した

$testString = '1234';
preg_match_all('/.+/', $testString, $matches);

しかし、それは文字列全体を返すだけです。

4

3 に答える 3

1

裏技を使えstrrevば可能です >>

コード:

$s = '1234';
preg_match_all('/(?=(.+$)).?/', strrev($s), $m);
foreach(range(sizeof($m[1]), 0) as $i) print strrev($m[1][$i]) . "\n"; 

出力:

1
12
123
1234

このデモを参照してください。


ただし、正規表現を使用しない単純なソリューションも使用する必要があります >>

コード:

$s = '1234';
foreach(range(1, strlen($s)) as $i) print substr($s, 0, $i) . "\n";

出力:

1
12
123
1234

このコードはこちらで確認してください。

于 2012-09-29T00:23:59.023 に答える
0

出来ますか?はい。それは合理的ですか?おそらくそうではありません。

特定の例で実行できることを示すために、Perl のデモを次に示します。

#!/usr/bin/perl -l

my $string = "abcd";

my $pattern = qr{
    ^
    (?=  ( .{1} )  )
    (?=  ( .{2} )  )
    (?=  ( .{3} )  )
    (?=  ( .{4} )  )
}x;

my @captures = ($string =~ $pattern);

print for @captures;

実行すると、次の出力が生成されます。

a
ab
abc
abcd

PHP が使用する PCRE ライブラリは、それを完全に行うことができます。しかし、私でさえそのようにはしません。

そして、任意のグループ化に関しては、それはさらにトリッキーになり、再帰パターンとさらに深刻な魔法が必要になります。なんらかの拡張性を保証するプログラミング コンテスト以外の目的ではなく、維持することを望んでいて、撃たれることのない実際のコードのためではありません。

于 2012-09-28T23:16:36.527 に答える
-1

いいえ、これは (合理的に) 正規表現では実行できません。

それがループが発明された理由です。for単純なループで何かを調理するのはとても簡単だと思います。

例:

$str = "1234";
for ($i = 0; $i < strlen($str); $i++) {
    echo substr($str, 0, $i+1) . "\n";
}
于 2012-09-28T22:52:37.763 に答える