问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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环境下运行
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么被告律师理亏还要拼命打官司 植物的细胞器有哪些 30.植物细胞特有的细胞器是 我的世界手机版mod为什莫显示已禁用 我的世界手机版启动器mod为什么输入了却没有效果 我的世界为什么我用不了mod 我的世界为什么我用不了mod ? 鸡翅炖土豆怎么做才能达到完美的口感? 鸡翅土豆条怎么做既省时又美味? 鸡翅土豆怎么烧简单又好吃 怎么做鸡翅烧土豆更好吃? 洁尔阴洗液在哪里可以买得到? 洁尔阴洗液有假的吗 能治疗哪些病 PHP 正则初学者 这段字符串如何截取? 红衬衫领子洗的发白怎么办 洁尔阴 主要卖什么规格 洁尔阴洗下面好吗?有什么效果?在哪买呀?多少钱呀大概 我想深入学习巩固PHP和javascript的正则表达式,请问应该选学哪本书呀? 我的心理健康吗? 衣服领子犯白变旧怎么办 妇炎洁和洁尔阴清洗剂分别多少钱?哪一个的清洗效果比较好? 你觉得你自己的心理健康吗?表现在哪里?如果觉得不健康,有什么表现?应该怎样去改变? php 正则表达式 问题 洁尔阴洗液贵吗??? 如何在PHP中使用正则表达式匹配html某标签内的特定几个属性 我心理健康吗 这种洁尔阴洗液在药房买大概多少钱。 我可不可以认为股票期权只是个对冲工具 洁尔阴洗液哪里有卖?大概多少钱 求教php正则高手。php正则获取html内容中的所有img路径及名称,替换img的路径 洁尔阴洗液为什么超市没有卖 价格大概是多少 PHP正则表达式 反斜线定义断言的限定符:&#92;A 、 &#92;Z、 &#92;G 、 &#92;z表示什么意思? 你好、看到你说洁尔阴治猫癣,我淘宝了一下… 是个妇科用药恩威洁尔阴洗液300ml,是这个吗? 左氧氟沙星 妇炎康片 洁尔阴洗液 消糜栓多少钱 我的心理健康么 废物利用DIY(追加20) 一张纸条粘成一个圆圈,用笔在上面画线条,回到原点之前不停笔不断线,把正反两面都画上,这个实验叫什么? 怎么判断自己的心理健康吗? 关于心理健康;我心理健康吗? 深色衣服领袖发白怎么恢复 怎么用word剪贴画中的半圆形做成风车 我的心理健康 我们的心理健康,是和我们的心情有很密切的联系吗? T恤洗后领子发白 用牙膏洗了蓝色毛料西服领子,结果掉色发白了,怎么办啊? 这个听说是很早的玩具 围着大圆圈可以画出很多图案 想知道这是什么? aj12怎么搭配裤子图片 现在的大学生疯狂购买Aj、椰子鞋,奢侈鞋真的适合大学生吗? 朋友们,阿迪达斯的椰子鞋好搭配衣服还是耐克的AJ呢? AJ椰子潮鞋有卖吗? 广东省公务员资格复审怎么用手机弄附件