2012-06-20 63 views
1

我使用下面的代碼:PHP的preg_match匹配的東西或沒有輸出assoc命令陣列

<?php 
$pattern = "/(?<item>.*)\:(?<value>.*)(\{(?<flag>.*)_(?<level>.*)\})/i"; 
$subject = "item:value{L_300}"; 
preg_match($pattern, $subject, $matches); 
print_r($matches); 

這將輸出如下:

array(
    array (
     0 => 'item:value{L_300}', 
     'item' => 'item', 
     1 => 'item', 
     'value' => 'value', 
     2 => 'value', 
     3 => '{L_300}', 
     'flag' => 'L', 
     4 => 'L', 
     'level' => '300', 
     5 => '300' 
    ) 
) 

我的問題是,受試者不會總是包含'{L_300}'部分,但我仍然需要使用該模式匹配'item:value'部分。

任何人都可以幫忙嗎?

這可能看起來像一個常見問題,但我找不到答案。

+0

你確定你發佈了正確的模式嗎?您發佈的內容不會匹配「L_300」或任何大括號,它只匹配冒號後的所有內容。 – eWolf

+0

您正在獲取'flag'和'level'的捕獲,這是您在正則表達式中沒有定義的。對我來說似乎很神奇。那,或錯誤的代碼發佈。 – lanzz

+0

對不起,我用我使用的實際模式更新了它。 – user1094128

回答

1

您可以添加一個?在捕獲組之後使其成爲可選項。我也冒昧地改變模式的其他一些地方,以防止*捕捉太多不尋常的情況下(如其中有一個額外的:或{字符)。

<?php 
$pattern = "/(?<item>[^:]*):(?<value>[^{]*)(\{(?<flag>[^_]*)_(?<level>[^}]*)\})?/i"; 

$subjects = array("itemname:valuehere{L_300}", 
"item2:anothervalue" 
); 

foreach ($subjects as $subject) { 
    print "Subject:\n$subject\n"; 
    preg_match($pattern, $subject, $matches); 
    print_r($matches); 
} 

輸出:

Subject: 
itemname:valuehere{L_300} 
Array 
(
    [0] => itemname:valuehere{L_300} 
    [item] => itemname 
    [1] => itemname 
    [value] => valuehere 
    [2] => valuehere 
    [3] => {L_300} 
    [flag] => L 
    [4] => L 
    [level] => 300 
    [5] => 300 
) 
Subject: 
item2:anothervalue 
Array 
(
    [0] => item2:anothervalue 
    [item] => item2 
    [1] => item2 
    [value] => anothervalue 
    [2] => anothervalue 
) 
相關問題