php 正则表达式如何判断一个字符串是否为合法的四则数学算式
发布网友
发布时间:2022-05-02 20:04
我来回答
共4个回答
热心网友
时间:2022-04-23 07:00
代码如下(经测通过):
<?php
$str="((1+1)*3.3)/10-12+(1+1)";
if(preg_match("/[\+\-\*\/\.]{2}|[^\+\-\*\/\(\)\d\.]+/i", $str, $matches)){
echo '非法算式';
} else {
if(substr_count($str,"(")==substr_count($str,")")){
echo '合法算式';
} else {
echo '括号不匹配';
}
}
?>
判断str里是否存在连续运算符、小数点或运算符、括号、数字以外的字符
若存在则非法
若不存在则判断str里( 和 )数量是否一致
热心网友
时间:2022-04-23 08:18
$str="((1+1)*3.3)/10-12+(1+1)"
if(preg_match('/^((\d++(\.\d+)?|\((?1)\))((\+|\/|\*|-)(\d++(\.\d+)?|(?1)))*)$/',$str))
echo "合法的算式";
在正则工具里是对的,不知道在php中怎么样,用这么多时间最多只能得20分
热心网友
时间:2022-04-23 09:53
//方法有多种,下边的只是一时想到,比较好处理的,其它的你可自己试着想想
<?php
$str="((1+1)*3.3)/10-12+(1+1)";
if($_str=preg_replace("/[\*|\+|\-|\(|\/]*\d*[\)|\/|.]*/",'',$str)){
echo $str.'==>'.$_str;
}else{
echo 'ok';
}
?>
追问这个好像只是看看有没有找到非法字符。但是没有办法判断 括号不配对,以及连续出现几个运算符号的问题
热心网友
时间:2022-04-23 11:44
^
(?!.*[^\d+\-*/\(\)]) #规则0,字符串必须由数字,符号和括号组成
(?!.*\)\d) #规则A,不允许右括号后接数字
(?!.*[+\-*/]([+\-*/]|\))) #规则B,不允许符号后面接符号或右括号
(?!.*\([+*/]) #规则C,不允许左括号后接运算符(- 可以表示负号)
(?!.*(\d|\))\() #规则D,不允许左括号前有数字或右括号
(?=\d|\-|\() #规则E,字符串开头必须是,数字,负号,左括号中的一个
(?=.*(\d|\))$) #规则F:结尾必须是数字或者右括号
[^\(\)]*
#开始匹配,捕获括号,使用平衡组来判断括号数量是否相等,需要.NET的支持
(
(
(?'open'\()
[^\(\)]*
)+
(
(?'-open'\))
[^\(\)]*
)+
)*
(?(open)(?!)) #规则G:左右括号数量必须相等
$
最终的正则表达式为:
^(?!.*[^\d+\-*/\(\)])(?!.*\)\d)(?!.*[+\-*/]([+\-*/]|\)))(?!.*\([+*/])(?!.*(\d|\))\()(?=\d|\-|\()(?=.*(\d|\))$)[^\(\)]*(((?'open'\()[^\(\)]*)+((?'-open'\))[^\(\)]*)+)*(?(open)(?!))$
没考虑空格的情况,因为考虑空格需要加很多很多个\s*,大大降低可读性
由于使用了平衡组,此正则表达式需要在.NET环境下运行