以下代码使用了我的
解析器类(它在 CC-BY 3.0 下发布),它适用于 UTF-8(感谢我的
UTF8 类)。
它的工作方式是通过使用递归函数来迭代字符串。每次找到
(
时,它将调用自身。当它到达字符串结尾而没有找到相应的
)
时,它还会检测不匹配的对。
此外,这个代码接受一个 $callback 参数,你可以用它来处理它找到的每一段内容。回调函数接收两个参数:1)字符串,2)级别(0 = 最深层)。无论回调函数返回什么都将替换字符串的内容(这些更改在更高级别的回调中可见)。
注意:该代码不包括类型检查。
非递归部分:
function ParseParenthesis( $string, $callback)
{
$parser = new Parser($string);
$result = ParseParenthesisFragment($parser, $callback);
if ($result['close'])
{
return $result['contents'];
}
else
{
return false;
}
}
递归部分:
function ParseParenthesisFragment( $parser, $callback)
{
$contents = '';
$level = 0;
while(true)
{
$parenthesis = array('(', ')');
$new = $parser->ConsumeUntil($parenthesis);
$parser->Flush();
$contents .= $new;
$element = $parser->Consume($parenthesis);
if ($element === '(')
{
$result = ParseParenthesisFragment($parser, $callback);
if ($result['close'])
{
$newLevel = $result['level'] + 1;
if ($newLevel > $level)
{
$level = $newLevel;
}
$new = call_user_func
(
$callback,
$result['contents'],
$level
);
$contents .= $new;
}
else
{
return array
(
'close' => false,
'contents' => $contents.$result['contents']
);
}
}
else if ($element == ')')
{
return array
(
'close' => true,
'contents' => $contents,
'level' => $level
);
}
else if ($result['status'] === null)
{
return array
(
'close' => false,
'contents' => $contents
);
}
}
}