<?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.png
,img2.jpg
,img3.png
和img4.jpg
带到名为img
的数组中,如下所示:
[img] => Array
(
[0] => img1.png
[1] => img2.jpg
[2] => img3.png
[3] => img4.jpg
)
答案 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
)