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

时间:2019-07-18 20:11:05

标签: php regex preg-match digits

我想更改正则表达式,以便如果类组在两个斜杠之间不只有数字时匹配它:

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

preg_match($regex, "upload/.bes/.ur/13"); // returns true
preg_match($regex, "upload/.tables/fewf/.u23ser/15"); // returns true
preg_match($regex, "upload/.t/les2/.uer/11"); // returns true
preg_match($regex, "upload/1.tales/.user2/01"); // returns true

preg_match($regex, "upload/23/21"); // returns false
preg_match($regex, "upload/.tables/00/31"); // returns false
preg_match($regex, "upload/6/.uer/q/51"); // returns false

3 个答案:

答案 0 :(得分:0)

也许,我们可以使用以下表达式简化它:

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

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


DEMO

测试

$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]+$

DEMO 2

答案 1 :(得分:0)

您可以使用

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

请参阅此regex demo

class命名的组模式匹配

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

答案 2 :(得分:0)

您可以使用所有格修饰符从digit类开始重写命名捕获:

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

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