2013-07-17 55 views
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,但它總是成爲錯誤PHP Warning: preg_match_all(): Compilation failed: two named subpatterns have the same name at offset ...。如果我將其中一個組名更改爲grp2,則效果良好。PHP - preg_match_all同一組,不同的基於模式

是否可以在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); 
?> 

我要採取一切,img2.jpg,img3.pngimg4.jpg分成數組組這樣的事情:

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

回答

1

在PHP中的所有正則表達式首先需要被包裹在邊界像/#

那麼你的正則表達式並不需要成爲這個複雜的。

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

全碼::

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

OUTPUT:

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

UPDATE:按照您的更新問題:

同樣可以使用這個正則表達式可以簡化
$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']); 

OUTPUT:

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

你好,謝謝你的回答,但不幸的是,我覺得我會錯過我解釋什麼。請參閱上面我更新的問題。 – Crazenezz

+0

好吧,我會盡力解決您的更新問題。 – anubhava

+0

非常感謝您的解決方案,但您能向我解釋正則表達式的用途嗎?我是新來的這個東西。 – Crazenezz