我正在寻找一个正则表达式模式,可以匹配php中字符串中的相邻字符。
例如,如果我有字符串“1234”,我希望它匹配并返回
1
12
123
1234
这可以用php中的正则表达式吗?
我试过
$testString = '1234';
preg_match_all('/.+/', $testString, $matches);
但这只会返回整个字符串。
答案 0 :(得分: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
请参阅this演示。
但是你也应该使用没有正则表达式>>
的简单解决方案的代码:强> 的
$s = '1234';
foreach(range(1, strlen($s)) as $i) print substr($s, 0, $i) . "\n";
的输出:强> 的
1
12
123
1234
检查此代码here。
答案 1 :(得分: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库完全能够做到这一点。但即使我这样做也不行。
至于任意分组,这变得更加棘手,需要递归模式甚至更严重的魔法。我不会做任何事情,除了某种类似防扩展的编程比赛,不是你希望保留的真实代码,也不是为了拍摄。
答案 2 :(得分:-1)
不,这不能(合理地)用正则表达式完成。
这就是为什么发明循环的原因。我确信使用简单的for
循环烹饪很容易。
示例:
$str = "1234";
for ($i = 0; $i < strlen($str); $i++) {
echo substr($str, 0, $i+1) . "\n";
}