PHP - preg_match_all相同的组,不同的模式

时间:2013-07-17 10:33:36

标签: php regex preg-match-all

<?php
    $str = '123.456.789.987,654,321,';

    // preg_match_all('((?<grp1>\d{3})\.|(?<grp2>\d{3})\,)', $str, $matches);
    preg_match_all('((?<grp1>\d{3})\.|(?<grp1>\d{3})\,)', $str, $matches);

    print_r($matches);
?>

根据上面的代码,我希望将所有字符串作为一个名为grp1的组数组,但它总是变为错误PHP Warning: preg_match_all(): Compilation failed: two named subpatterns have the same name at offset ...。如果我将其中一个组名更改为grp2,则效果很好。

是否可以在preg_match_all中使用1个组名而不是不同的组名?


更新

我无法使用此类/(?<grp1>\d{3})[.,]/之类的内容,这是一个清除问题的示例:

<?php
    $str = '
        src="img1.png"
        src="img2.jpg"
        url(img3.png)
        url(img4.jpg)
    ';

    preg_match_all('/src=\"(?<img1>(\w+)(.png|.jpg))\"|url\((?<img2>(\w+)(.png|.jpg))\)/', $str, $matches);

    print_r($matches);
?>

我想将所有img1.pngimg2.jpgimg3.pngimg4.jpg带到名为img的数组中,如下所示:

[img] => Array
    (
        [0] => img1.png
        [1] => img2.jpg
        [2] => img3.png
        [3] => img4.jpg
    )

1 个答案:

答案 0 :(得分:1)

首先,PHP中的正则表达式需要包含在/#等边界中。

然后你的正则表达式不需要这么复杂。使用此正则表达式可以简化相同:

/(?<grp1>\d{3})[.,]/

完整代码:

$str = '123.456.789.987,654,321,';
preg_match_all('/(?<grp1>\d{3})[.,]/', $str, $matches);
print_r($matches['grp1']);

<强>输出:

Array
(
    [0] => 123
    [1] => 456
    [2] => 789
    [3] => 987
    [4] => 654
    [5] => 321
)

更新:根据您更新的问题:

$str = '
        src="img1.png"
        src="img2.jpg"
        url(img3.png)
        url(img4.jpg)
    ';
preg_match_all('/(?<=src="|url\()(?<img>[^")]+)/i', $str, $matches);
print_r($matches['img']);

<强>输出:

Array
(
    [0] => img1.png
    [1] => img2.jpg
    [2] => img3.png
    [3] => img4.jpg
)