1
<?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が、常に error になりますPHP Warning: preg_match_all(): Compilation failed: two named subpatterns have the same name at offset ...。グループ名の1つを変更すると、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.pngすべての、img2.jpgimg3.pngおよびを、次のようなimg4.jpg名前の配列グループに取りたいと考えています。img

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

1 に答える 1

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
)
于 2013-07-17T10:40:45.693 に答える