抛转引玉方式求正则匹配问题

董哥007 上海闪尖科技有限公司 php开发工程师  2020-07-21 02:58:24
我要用正则匹配一个url 这个url必须同时含有2个参数 sp和bm

形如 aa=2&sp=2&bm=333


我自己实现了一个正则
$pat = '/(bm=\d+).+(sp=\d+)/';


但是这个匹配规则是有bug的、
比如我 ss=4&bm=111&dbm=ttt这种也算匹配成功。。所以我这个规则对参数中间的校验不会写了,求大佬支招
...全文
208 点赞 收藏 12
写回复
12 条回复
yzs1013 2020年08月07日
<?php //$str="aa=2&bm=2&sp=333";//或 $str="aa=2&sp=2&bm=333"; if(preg_match("/(?<=^|\&|\?)sp(?=\=).*(?<=^|\&|\?)bm(?=\=)|(?<=^|\&|\?)bm(?=\=).*(?<=^|\&|\?)sp(?=\=)/Uisx",$str,$nn)){ echo 1; }else{ echo 0; } ?>
回复 点赞
董哥007 2020年08月02日
首先我先谢谢你的回答,其实我的诉求还是想知道正则的实现方法
回复 点赞
浴火_凤凰 2020年08月02日
这个需求感觉正则不太好理解 把楼主的伪代码 大概实现了一下,楼主可以参考看看

function checkstr($str){
  //伪代码如下
  $pos=strpos($str,"?");
 if($pos>-1&&strpos($str,"bm=")>$pos&&strpos($str,"sp=")>$pos)
    {
        return true;
    }
    else
    {
        return false;
    }
}
回复 点赞
董哥007 2020年07月22日
这还需要试吗。你这个正则,两个变量之间的东西,你用的.* 这个并不能做url合法性验证。懂吗。我基本正则还是懂的
回复 点赞
下雨的声音丶 2020年07月21日
引用 7 楼 董哥007 的回复:
[quote=引用 6 楼 下雨的声音丶 的回复:][quote=引用 5 楼 董哥007 的回复:][quote=引用 4 楼 下雨的声音丶 的回复:][quote=引用 3 楼 董哥007 的回复:][quote=引用 2 楼 下雨的声音丶 的回复:]/((^sp|&sp)=\d+).*(&bm=\d+)|((^bm|&bm)=\d+).*(&sp=\d+)/ 这样应该满足
一看就知道不对啊,你2个参数中间的.*没有对url合法性做校验。[/quote] ?[/quote] 我要的效果 是 相当于一个方法 function checkstr(str){ //伪代码如下 1.这个字符串url必须包含bm和sp参数 2.这个字符串必须是合法的querystring也就是 ?后面的东西 if(满足上面条件){ return ture } else{ return false } }[/quote] 既然是在PHP里面处理那就简单了啊,我还以为是在nginx 或者apache 里面使用呢 用这个函数 解析一下在判断是否存在 就行了 https://www.php.net/manual/zh/function.parse-str.php[/quote] 我用函数写的伪代码 是表明我的需求,实际上 我是想知道正则怎么实现[/quote] 我的正则是没问题的,你倒是试一试啊
回复 点赞
董哥007 2020年07月21日
引用 6 楼 下雨的声音丶 的回复:
[quote=引用 5 楼 董哥007 的回复:][quote=引用 4 楼 下雨的声音丶 的回复:][quote=引用 3 楼 董哥007 的回复:][quote=引用 2 楼 下雨的声音丶 的回复:]/((^sp|&sp)=\d+).*(&bm=\d+)|((^bm|&bm)=\d+).*(&sp=\d+)/ 这样应该满足
一看就知道不对啊,你2个参数中间的.*没有对url合法性做校验。[/quote] ?[/quote] 我要的效果 是 相当于一个方法 function checkstr(str){ //伪代码如下 1.这个字符串url必须包含bm和sp参数 2.这个字符串必须是合法的querystring也就是 ?后面的东西 if(满足上面条件){ return ture } else{ return false } }[/quote] 既然是在PHP里面处理那就简单了啊,我还以为是在nginx 或者apache 里面使用呢 用这个函数 解析一下在判断是否存在 就行了 https://www.php.net/manual/zh/function.parse-str.php[/quote] 我用函数写的伪代码 是表明我的需求,实际上 我是想知道正则怎么实现
回复 点赞
下雨的声音丶 2020年07月21日
引用 5 楼 董哥007 的回复:
[quote=引用 4 楼 下雨的声音丶 的回复:][quote=引用 3 楼 董哥007 的回复:][quote=引用 2 楼 下雨的声音丶 的回复:]/((^sp|&sp)=\d+).*(&bm=\d+)|((^bm|&bm)=\d+).*(&sp=\d+)/ 这样应该满足
一看就知道不对啊,你2个参数中间的.*没有对url合法性做校验。[/quote] ?[/quote] 我要的效果 是 相当于一个方法 function checkstr(str){ //伪代码如下 1.这个字符串url必须包含bm和sp参数 2.这个字符串必须是合法的querystring也就是 ?后面的东西 if(满足上面条件){ return ture } else{ return false } }[/quote] 既然是在PHP里面处理那就简单了啊,我还以为是在nginx 或者apache 里面使用呢 用这个函数 解析一下在判断是否存在 就行了 https://www.php.net/manual/zh/function.parse-str.php
回复 点赞
董哥007 2020年07月21日
引用 4 楼 下雨的声音丶 的回复:
[quote=引用 3 楼 董哥007 的回复:][quote=引用 2 楼 下雨的声音丶 的回复:]/((^sp|&sp)=\d+).*(&bm=\d+)|((^bm|&bm)=\d+).*(&sp=\d+)/ 这样应该满足
一看就知道不对啊,你2个参数中间的.*没有对url合法性做校验。[/quote] ?[/quote] 我要的效果 是 相当于一个方法 function checkstr(str){ //伪代码如下 1.这个字符串url必须包含bm和sp参数 2.这个字符串必须是合法的querystring也就是 ?后面的东西 if(满足上面条件){ return ture } else{ return false } }
回复 点赞
下雨的声音丶 2020年07月21日
引用 3 楼 董哥007 的回复:
[quote=引用 2 楼 下雨的声音丶 的回复:]/((^sp|&sp)=\d+).*(&bm=\d+)|((^bm|&bm)=\d+).*(&sp=\d+)/ 这样应该满足
一看就知道不对啊,你2个参数中间的.*没有对url合法性做校验。[/quote] ?
回复 点赞
董哥007 2020年07月21日
引用 2 楼 下雨的声音丶 的回复:
/((^sp|&sp)=\d+).*(&bm=\d+)|((^bm|&bm)=\d+).*(&sp=\d+)/ 这样应该满足
一看就知道不对啊,你2个参数中间的.*没有对url合法性做校验。
回复 点赞
下雨的声音丶 2020年07月21日
/((^sp|&sp)=\d+).*(&bm=\d+)|((^bm|&bm)=\d+).*(&sp=\d+)/ 这样应该满足
回复 点赞
热心的码农 2020年07月21日
explode 分数组去判断吧,简单很多
回复 点赞
发动态
发帖子
基础编程
创建于2007-09-28

9735

社区成员

14.0w+

社区内容

从PHP安装配置,PHP入门,PHP基础到PHP应用
社区公告
暂无公告