URL 子部分序列中不能只有数字
Can't have only digits in URL subpart sequence
我想更改正则表达式,以便在 class 组不只有两个斜线之间的数字时匹配:
$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
也许,我们可以用这个表达式来简化它:
(\/[0-9]+\/)|([0-9]+$)
如果左捕获组return为真,则为假,否则为真。
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
您可以使用
$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 字母、数字、_
或 .
,但如果所有这些字符都是数字则不是
您可以使用所有格量词重写以数字 class 开头的命名捕获:
(?<class>\d*+[a-z0-9_.]+(?>/\d*+[a-z0-9_.]+)*)
由于量词是所有格,你确定[a-z0-9_.]+
匹配的第一个字符不是数字
我想更改正则表达式,以便在 class 组不只有两个斜线之间的数字时匹配:
$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
也许,我们可以用这个表达式来简化它:
(\/[0-9]+\/)|([0-9]+$)
如果左捕获组return为真,则为假,否则为真。
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
您可以使用
$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 字母、数字、_
或.
,但如果所有这些字符都是数字则不是
您可以使用所有格量词重写以数字 class 开头的命名捕获:
(?<class>\d*+[a-z0-9_.]+(?>/\d*+[a-z0-9_.]+)*)
由于量词是所有格,你确定[a-z0-9_.]+
匹配的第一个字符不是数字