为了账号安全,请及时绑定邮箱和手机立即绑定

URL 子部分序列中不能只有数字

URL 子部分序列中不能只有数字

PHP
跃然一笑 2021-10-15 17:45:57
我想更改正则表达式,以便在类组在两个斜杠之间没有只有数字时匹配:$regex = "~^upload/(?<class>[/a-z0-9_\.]+)/(?<id_table>\d+)$~";preg_match($regex, "upload/.bes/.ur/13"); // returns truepreg_match($regex, "upload/.tables/fewf/.u23ser/15"); // returns truepreg_match($regex, "upload/.t/les2/.uer/11"); // returns truepreg_match($regex, "upload/1.tales/.user2/01"); // returns truepreg_match($regex, "upload/23/21"); // returns falsepreg_match($regex, "upload/.tables/00/31"); // returns falsepreg_match($regex, "upload/6/.uer/q/51"); // returns false
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

您可以从带有所有格量词的 digit 类开始重写您的命名捕获:

(?<class>\d*+[a-z0-9_.]+(?>/\d*+[a-z0-9_.]+)*)

由于量词是所有格,您确定匹配的第一个字符[a-z0-9_.]+不是数字。


查看完整回答
反对 回复 2021-10-15
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您可以使用

$regex = "~^upload/(?<class>(?!\d+/)[a-z0-9_.]+(?:/(?!\d+/)[a-z0-9_.]+)*)/(?<id_table>\d+)$~";

请参阅此正则表达式演示

class组命名模式匹配

  • (?!\d+/)[a-z0-9_.]+ - 一个或多个小写 ASCII 字母、数字_.,但如果所有这些字符都是数字,则不是

  • (?:/(?!\d+/)[a-z0-9_.]+)* - 零次或多次重复

    • /- 一个/字符

    • (?!\d+/)[a-z0-9_.]+- 一个或多个小写 ASCII 字母、数字_.,但如果所有这些字符都是数字,则不是


查看完整回答
反对 回复 2021-10-15
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

也许,我们可以用这个表达式来简化它:


(\/[0-9]+\/)|([0-9]+$)

如果左捕获组返回 TRUE,则为 false,否则为 TRUE。


测试

$re = '/(\/[0-9]+\/)|([0-9]+$)/m';

$str = 'upload/.bes/.ur/13

upload/.tables/.u23ser/15

upload/.tles2/.uer/11

upload/1.tales/.user2/01


upload/23/21

upload/.tables/00/31

upload/6/.uer/51';


preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);


foreach ($matches as $match) {

    if (sizeof($match) == 2) {

        echo "false \n";

    } elseif (sizeof($match) == 3) {

        echo "true \n";

    } else {

        "Something is not right!  \n";

    }

}

输出

true 

true 

true 

true 

false 

true 

false 

true 

false 

true 

一旦过滤掉不需要的字符串,我们可以简单地捕获这些类:


^(upload\/.*?)[0-9]+$


查看完整回答
反对 回复 2021-10-15
  • 3 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号