我有一個這樣的字符串: (... 1(... 2個DS(... 3(... 4))))快速地找到支架在PHP
哪家最好如果在DS結束之前我不知道DS後有多少括號,可以在DS括號中找到數據? (3,4) 它就像數學:在3和4括號中乘以ds。
我有一個這樣的字符串: (... 1(... 2個DS(... 3(... 4))))快速地找到支架在PHP
哪家最好如果在DS結束之前我不知道DS後有多少括號,可以在DS括號中找到數據? (3,4) 它就像數學:在3和4括號中乘以ds。
它不能通過正則表達式來完成。它不是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
)
這是不可能使用正則表達式。 正則表達式無法保存有多少個左括號......
您應該使用php進行編碼。
使用函數substr從DS出現的位置取出子串,並從中獲取數據。 要獲取數據,只需解析保留開始括號數的子字符串即可。當右括號開始時,保留它們的數量。當這個計數和以前的計數相等時,你已經獲得了你的數據。
他不知道在DS結束之前有多少括號,這意味着他需要DS的內容與括號相關。所以一個簡單的子串就不會這樣做。 – 2012-04-07 06:37:32
@ David-SkyMesh我已經編輯完整的解釋。 – Sushant 2012-04-07 06:49:42
這是否適合自己?
preg_match_all('/DS\(...(\d)+ \)?\(?[DS]?/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];
你可能不得不實現一個小解析器,使用堆棧來管理這些設置您目前正在觀察括號。 – 2012-04-07 06:35:27
查看@ shiplu.mokadd.im的答案是一個合理的例子。 – 2012-04-07 07:06:48