【发布时间】:2013-03-31 10:33:18
【问题描述】:
如果有人擅长 PHP 可以建议如何验证表达式字符串中的括号,我正在徘徊,如下所示:
( 5 * 3 [ 6 ) - 6]
这是错误的表达方式。我需要一个函数来做到这一点。到目前为止,这是我尝试过的:
<?php
function hasMatchedParenthesis($string) {
$counter1 = 0;
$counter2 = 0;
$length = strlen($string);
for ($i = 0;$i < $length; $i++) {
$char = $string[$i];
if( $char == '(' ) {
$counter1 ++;
} elseif( $char == ')' ) {
$counter1 --;
}
for($j =0;$j < $length; $j++) {
$char = $string[$j];
if( $char == '[' ) {
$counter2 ++;
} elseif( $char == ']' ) {
$counter2 --;
}
}
if( $counter1 < 0 || $counter2 < 0) {
return false;
}
}
echo 'ok';;
}
hasMatchedParenthesis('[5] * 3 - ( 4 - 7 * [3-6])'); // this is ok!
hasMatchedParenthesis('( 5 * 3 [ 6 ) - 6]'); // this returns as TRUE, but it is not!
?>
请帮我解决“[6]”的验证问题!我不知道该怎么做:(
【问题讨论】:
-
你允许嵌套括号吗?例如
((1 + 3) / (2 - 5)) + 5... 如果是这样,最好使用适当的词法分析器 -
我认为你的检查条件不对。应该是
if ($counter1 != 0 || $counter2 != 0){ return false; }。您从两个计数器0开始,当您完成验证括号是否有效时,它们都应该是0。这是对@MarkBaker 评论的补充:-) -
ircmaxell 对stackoverflow.com/questions/12692727/… 的回答是一个很好的数学公式词法分析器(如果你也需要解析器)的起点
标签: php string validation math