3 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個贊
您可以從帶有所有格量詞的 digit 類開始重寫您的命名捕獲:
(?<class>\d*+[a-z0-9_.]+(?>/\d*+[a-z0-9_.]+)*)
由于量詞是所有格,您確定匹配的第一個字符[a-z0-9_.]+
不是數(shù)字。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個贊
您可以使用
$regex = "~^upload/(?<class>(?!\d+/)[a-z0-9_.]+(?:/(?!\d+/)[a-z0-9_.]+)*)/(?<id_table>\d+)$~";
請參閱此正則表達(dá)式演示。
該class
組命名模式匹配
(?!\d+/)[a-z0-9_.]+
- 一個或多個小寫 ASCII 字母、數(shù)字_
或.
,但如果所有這些字符都是數(shù)字,則不是(?:/(?!\d+/)[a-z0-9_.]+)*
- 零次或多次重復(fù)/
- 一個/
字符(?!\d+/)[a-z0-9_.]+
- 一個或多個小寫 ASCII 字母、數(shù)字_
或.
,但如果所有這些字符都是數(shù)字,則不是

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個贊
也許,我們可以用這個表達(dá)式來簡化它:
(\/[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]+$
- 3 回答
- 0 關(guān)注
- 196 瀏覽
添加回答
舉報(bào)