2011-09-18 127 views
2

失去了我的正則表達式初學者所以,我得到完全失去了它沒有多久了一下:]用的preg_match正則表達式

我需要做什麼:

我已經得到了一串數值'a:b,a2:b2,a3:b3,a4:b4',其中我需要通過給定對的第二個值(b2)搜索特定的一對值(即:a2:b2) )並獲得該對的第一個值作爲輸出(a2)。

所有字符都被允許的(除了「」其中的方式隔開每對值)和任何第二值(B,B2,B3,B4)是獨特的(不能是不止一次本多項所述字符串中)

讓我給一個更好的例子,如前可能不是很清楚:

這是一個字符串:2分:2.5分:5,10分鐘:10,15分鐘:15,永不:0

已搜索的格局是:5

我想,最好的方法是使用函數調用具有子模式功能的preg_match。

所以我試過如下:

$str = '2 minutes:2,5 minutes:5,10 minutes:10,15 minutes:15,20 minutes:20,30 minutes:30, never:0'; 

$re = '/(?P<name>\w+):5$/'; 
preg_match($re, $str, $matches); 

echo $matches['name']; 

通緝輸出是「5分鐘,但沒有奏效。

我也想堅持Perl兼容的reg。表達式作爲上面的代碼包含在PHP腳本中。

任何人都可以幫我嗎?我現在有點絕望了,因爲我現在在這一天的大部分時間裏都花費了...

感謝你們所有人。

回答

0
$str = '2 minutes:2,51 seconds:51,5 minutes:5,10 minutes:10,15 minutes:51,never:0'; 
$search = 5; 

preg_match("~([^,\:]+?)\:".preg_quote($search)."(?:,|$)~", $str, $m); 

echo '<pre>'; print_r($m); echo '</pre>'; 

輸出:

Array 
(
    [0] => 5 minutes:5 
    [1] => 5 minutes 
) 
+0

工程就像一個魅力!謝謝。 – Ondrej

+0

'$ search'通常會被轉義(參見'preg_quote');再加上你的表情會失敗,如果有另外一對是在5分鐘:5'對之前出現的第二個以5開始的元素。 -1 – Artefacto

+0

2Artefacto:不幸的是。對於如何解決這個問題,有任何的建議嗎? – Ondrej

0
$re = '/(?:^|,)(?P<name>[^:]*):5(?:,|$)/'; 

除了具有5後,以匹配$,其中如果5是最後一個元素只會工作,你的表達問題,你也想確保後5要麼沒有東西或另一對來;在該對的第一個元素出現之前,或者是另一個元素或該字符串的開始,並且您希望在該對的第一個元素中匹配多於\w

0

A preg_match調用會比較短,但我認爲我不會打擾正則表達式,而只是使用字符串和數組操作。

$pairstring = '2 minutes:2,5 minutes:5,10 minutes:10,15 minutes:15,20 minutes:20,30 minutes:30, never:0'; 

function match_pair($searchval, $pairstring) { 
    $pairs = explode(",", $str); 
    foreach ($pairs as $pair) { 
    $each = explode(":", $pair); 
    if ($each[1] == $searchval) { 
     echo $each[0]; 
    } 
    } 
} 

// Call as: 
match_pair(5, $pairstring); 
+0

這是我的第一個工作液(用字符串函數+的foreach ),但我認爲preg_match會更快更短。 – Ondrej

0

幾乎相同@Michael的。它不搜索元素,但構造了一個字符串數組。你說值是唯一的,這樣它們被用作在我的數組鍵:

$str = '2 minutes:2,5 minutes:5,10 minutes:10,15 minutes:15,20 minutes:20,30 minutes:30, never:0'; 
$a = array(); 
foreach(explode(',', $str) as $elem){ 
    list($key, $val) = explode(':', $elem); 
    $a[$val] = $key; 
} 

然後訪問一個元素很簡單:

echo $a[5];