【问题标题】:PHP - preg_match_all Same Group, Different PatternPHP - preg_match_all 相同的组,不同的模式
【发布时间】:2013-07-17 19:32:19
【问题描述】:
<?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 个组名而不是不同的组名?


更新

我不能使用 /(?&lt;grp1&gt;\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
    )

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案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
    )
    

    【讨论】:

    • 嗨,谢谢你的回答,但不幸的是,我想我的解释遗漏了一些东西。请参阅上面我更新的问题。
    • 非常感谢您的解决方案,但您能向我解释一下正则表达式的作用吗?我是这个东西的新手。
    • 当然。 (?&lt;=src="|url\() 是一个正向的lookbehind,如果它前面有src="url(,它确保匹配next part。下一部分是匹配 1 个或多个字符,直到找到 ")
    • i到底是干什么的?
    • i 用于忽略 src 的大小写,SRC 都将被匹配。
    猜你喜欢
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多