php 正则表达式如何判断一个字符串是否为合法的四则数学算式

[PHP code]$str="((1+1)*3.3)/10-12+(1+1)";//类似这样的算式语句,最多只包含0-9,+-*/.()
if(preg_match("四则算式正则匹配语句", $str))
{ echo "合法的算式";
}
else
{ echo "非法算式";
}

//只有这么多分了。

第1个回答  推荐于2016-04-06

代码如下(经测通过):

<?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里( 和 )数量是否一致

本回答被提问者采纳
第2个回答  2013-12-25
$str="((1+1)*3.3)/10-12+(1+1)"
if(preg_match('/^((\d++(\.\d+)?|\((?1)\))((\+|\/|\*|-)(\d++(\.\d+)?|(?1)))*)$/',$str))
    echo "合法的算式";

在正则工具里是对的,不知道在php中怎么样,用这么多时间最多只能得20分

第3个回答  2013-12-25
//方法有多种,下边的只是一时想到,比较好处理的,其它的你可自己试着想想
<?php
$str="((1+1)*3.3)/10-12+(1+1)";
if($_str=preg_replace("/[\*|\+|\-|\(|\/]*\d*[\)|\/|.]*/",'',$str)){
echo $str.'==>'.$_str;
}else{
echo 'ok';
}
?>

追问

这个好像只是看看有没有找到非法字符。但是没有办法判断 括号不配对,以及连续出现几个运算符号的问题

第4个回答  推荐于2016-09-06
^
(?!.*[^\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环境下运行

php 正则表达式如何判断一个字符串是否为合法的四则数学算式
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...

php判断是否为数字
else echo('不是数字');[\/code]这两种方法的区别是 is_numeric小数也会认为是数字,而前面正则会把小数点当作字符。

php 如何用正则表达式判断字符串是否是域名
pattern ="\/(https?|ftps?:)\\ \/ \\ \/ (\\w+\\.)?(\\w+)(\\.\\w+){1,3}\/";

正则表达式判断字符串中包含数字,大写字符,小写字母,特殊符号中的几种...
function passwordValidate(str){ var rC = { lW:'[a-z]',\/\/小写字母 uW:'[A-Z]',\/\/大写字母 nW:'[0-9]',\/\/汉字 sW:'[\\\ -\\\/\\\:-\\\@\\\[-\\\`\\\{-\\\~]'\/\/特殊字符 };

php判断是否为数字
有两种方法可以判断 一种是:直接使用一个函数, is_numeric() 这个函数就是检测参数是否为数字,如果是就返回true,如果不是就返回false,比如:<?php is_numeric( 'abcd123' ) or die('提供的参数不是数字');另一种是:使用正则表达式匹配,匹配成功就是数字,返回true,匹配不成功就不是数字,...

PHP中提取字符串--正则
正如上面说的,正则表达式看起来非常复杂,让人害怕,大多数的PHP初学者都会跳过这里,继续下面的学习,但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能,不学实在太可惜了……3 正则表达式的基本语法:一个正则...

正则表达式匹配字符串的问题
^((?!hede).)上面这个表达式就能过滤出不包含‘hede'字串的信息。我上面也说了,这种写法并不是正则表达式“擅长”的用法,但它是可以这样用的。解释 一个字符串是由n个字符组成的。在每个字符之前和之后,都有一个空字符。这样,一个由n个字符组成的字符串就有n+1个空字符串。我们来看一下“AB...

求PHP 的正则表达式 大全
匹配中文字符的正则表达式: [\一-\龥] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\\x00-\\xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:\\n\\s*\\r 评注:可以用来删除空白行 匹配...

PHP如何判断一个字符串是否为拼音
把所有的拼音组合做成一个数组,当判断一个字符串是否为拼音时就用这个数组来进行对比

PHP正则表达式,字符串不包含数字
你好,很高兴为您回答这个问题。其实这个也是很简单,如果单纯的判断一个字符串是不是纯数字,可以用PHP的一个函数 is_numeric ,没有必要用正则。如果非要用正则,也可以。

相似回答