2009-06-11 38 views
0

我有一個字符串的三個變化:PHP/JavaScript的正則表達式 - 非捕獲組

1. view=(edit:29,30) 
2. view=(edit:29,30;) 
3. view=(edit:29,30;x:100;y:200) 

我需要一個正則表達式是:

  1. 捕獲直至幷包括」 30"
  2. 捕獲「x:100; y:200」 - 每當第一場比賽後有分號時;
  3. 不會在任何組中包含最左邊的分號;
  4. 整個字符串在第一個分號的右邊,最多')'可以/應該在同一個組中。

我想出:

$pat = '/view=\((\w+)(:)([\d,]+)((;[^)]+){0,}|;)\)/'; 

應用於 '視圖=(編輯:29,30; X:100; Y:200)' 它產生:

Array 
(
    [0] => view=(edit:29,30;x:100;y:200) 
    [1] => edit 
    [2] => : 
    [3] => 29,30 
    [4] => ;x:100;y:200 
    [5] => ;x:100;y:200 
) 

問題。我如何刪除';'從比賽[4]和[5]?

重要事項。當不存在分號時,相同的RegExp應該與字符串一起工作,如:'view =(edit:29,30)'。

$pat = '/view=\((\w+)(:)([\d,]+)((;[^)]+){0,}|;)\)/'; 
$str = 'view=(edit:29,30;x:100;y:200)'; 
preg_match($pat, $str, $m); 
print_r($m); 

謝謝!

回答

4

您不需要將所有內容組合在一起。試試這個正則表達式:

/view=\((\w+):([\d,]+)(?:;([^)]+)?)?\)/ 
0

我想你想是這樣的:

$pattern = '/view=\\((\\w+):(\\d+,\\d+)(?:;((?:\\w+:\\d+;?)*))?\\)/'; 

應該返回

[0] view=(edit:29,30;x:100;y:200) 
[1] edit 
[2] 29,30 
[3] x:100;y:200