2

我正在尝试从字符串中获取所有匹配项:

$string = '[RAND_15]d4trg[RAND_23]';

preg_match 像这样:

$match = array();
preg_match('#\[RAND_.*]#', $string, $match);

但在那之后 $match 数组看起来像这样:

Array ( [0] => [RAND_15]d4trg[RAND_23] )

我应该怎么做才能将这两个事件都作为 $match 数组中的 2 个单独的元素?我想得到这样的结果:

$match[0] = [RAND_15];
$match[1] = [RAND_23];
4

1 回答 1

5

利用 ...

$match = array();
preg_match_all('#\[RAND_.*?]#', $string, $match);

... 反而。?修饰符将使模式变得“惰性”,匹配尽可能短的子字符串。没有它,模式将尝试覆盖可能的最大距离,并且从技术上讲,[RAND_15]d4trg[RAND_23] 确实匹配模式。

另一种方法是限制字符集以匹配否定字符类:

$match = array();
preg_match_all('#\[RAND_[^]]*]#', $string, $match);

这样我们就不必将量词变成惰性量词,因为[^]]字符类将在第一个]符号处停止匹配。

不过,要捕获所有匹配项,您应该使用preg_match_all而不是preg_match. 这是说明差异的演示。

于 2013-06-10T17:38:41.823 回答