2012-04-07 46 views
1

我有一個這樣的字符串: (... 1(... 2個DS(... 3(... 4))))快速地找到支架在PHP

哪家最好如果在DS結束之前我不知道DS後有多少括號,可以在DS括號中找到數據? (3,4) 它就像數學:在3和4括號中乘以ds。

+0

你可能不得不實現一個小解析器,使用堆棧來管理這些設置您目前正在觀察括號。 – 2012-04-07 06:35:27

+1

查看@ shiplu.mokadd.im的答案是一個合理的例子。 – 2012-04-07 07:06:48

回答

4

它不能通過正則表達式來完成。它不是regular language。它的一般解析。

$data = '(...1 (...2 DS(...3 (...4) 5))6)'; 
$num = array(); 
$start = strpos($data, 'DS') + strlen('DS'); 
$end = strlen($data) - 1; 
$paren = 0; 
for ($i = $start;$i <= $end;$i++) { 
    $n = $data[$i]; 
    if ($n == '(') $paren++; 
    if ($n == ')') $paren--; 
    if ($paren >= 0 && is_numeric($n)) { 
     $num[] = $n; 
    } 
} 
print_r($num); 

輸出

Array 
(
    [0] => 3 
    [1] => 4 
    [2] => 5 
) 
3

這是不可能使用正則表達式。 正則表達式無法保存有多少個左括號......

您應該使用php進行編碼。

-1

使用函數substr從DS出現的位置取出子串,並從中獲取數據。 要獲取數據,只需解析保留開始括號數的子字符串即可。當右括號開始時,保留它們的數量。當這個計數和以前的計數相等時,你已經獲得了你的數據。

+0

他不知道在DS結束之前有多少括號,這意味着他需要DS的內容與括號相關。所以一個簡單的子串就不會這樣做。 – 2012-04-07 06:37:32

+0

@ David-SkyMesh我已經編輯完整的解釋。 – Sushant 2012-04-07 06:49:42

0

這是否適合自己?

preg_match_all('/DS\(...(\d)+ \)?\(?[DS]?/', $subject, $result, PREG_PATTERN_ORDER); 
$result = $result[0];