PHP的preg_match:多组+匹配或*修改不会出现在结果呢?

问题描述 投票:2回答:1

如果我这样做在PHP中:

$str = "abc pqrs-1/2&3uvw xyz";
preg_match( "/([a-z]+)([^0-9a-z][0-9])+([a-z]+)/" , $str , $m );

将导致$m比赛将是:

[0] => "pqrs-1/2&3uvw"
[1] => "pqrs"
[2] => "&3"
[3] => "uvw"

注意([^0-9a-z][0-9])+部分,这是应该如何搭上“一个非字母数字字符,后面跟着买一个数字”一次或多次,有括号外的+修改。

显然,主题字符串$str包含此模式3场比赛:-1/2&3但只记得最后一个。

有没有办法以某种方式一网打尽?

我曾尝试preg_match_all代替preg_match的,但如果整个正则表达式的目标字符串匹配中不止一次地只能找到多个匹配。

用语言表达我的正则表达式的含义:

  1. 一个或多个字母
  2. 的一种或多种:非字母数字字符后跟数字
  3. 一个或多个字母

因此,对于上面的例子字符串我希望得到的结果是这样的:

[0] => "pqrs-1/2&3uvw"
[1] => "pqrs"
[2] => [ "-1" , "/2" , "&3" ]
[3] => "uvw"

但无论我怎么努力,我不能让它也给-1/2比赛吗?

php regex preg-match
1个回答
1
投票

你可以不匹配重复子反复捕获组。相反,你需要,使用一个两步走的方法做:

  • 使用正则表达式/([a-z]+)((?:[^0-9a-z][0-9])+)([a-z]+)/相匹配,并与((?:[^0-9a-z][0-9])+)捕捉(?:[^0-9a-z][0-9])模式的所有重复
  • 然后,使用preg_match_all与组模式,'/[^0-9a-z][0-9]/'

PHP demo

$str = "abc pqrs-1/2&3uvw xyz";
if (preg_match('~([a-z]+)((?:[^0-9a-z][0-9])+)([a-z]+)~', $str, $matches)) {
    preg_match_all('~[^0-9a-z][0-9]~', $matches[2], $x);
    $matches[2] = $x[0];
}
print_r($matches);

输出:

Array
(
    [0] => pqrs-1/2&3uvw
    [1] => pqrs
    [2] => Array
        (
            [0] => -1
            [1] => /2
            [2] => &3
        )

    [3] => uvw
)
© www.soinside.com 2019 - 2024. All rights reserved.