簡體   English   中英

如何只使用正則表達式允許一定數量的正斜杠?

[英]How to only allow certain number of forward slashes using regular expression?

我正在路由我的應用程序,我想在tags/的目錄路徑之后只允許最多2個目錄子路徑。 連字符和alnums是唯一允許的字符。

以下將全部驗證,下面的粗體將作為單個匹配返回到路由器:

  • 標簽/ 怎么烤
  • 標簽/ 怎么烘烤/餅干

如果有超過2個子路徑(或者說2個或更多斜杠,換句話說),路由器應該不返回任何匹配項。

我的服務器在尾部斜杠上重定向(到非尾部斜杠URL),因此不需要考慮它們。

我目前正在使用tags/([\\w+\\-\\/]+)$但是這將允許無限多個子路徑,並且在路由器返回匹配后我被迫檢查子路徑長度(正斜杠計數)。

我不確定如何在我寫的字符集中只允許0或1個正斜杠,同時可能跟隨單詞字符,然后將它們全部作為單個匹配返回。

這可能是正則表達式嗎?

Barmar的解決方案完美地回答了你的問題...這只是考慮路徑表達式中的尾部斜線的另一個版本:

(tags\/[-\w]+\/?(?:[-\w]+)?(?<!\/)\/?)$

regex101.com

這個正則表達式應該這樣做:

tags/[\w\-]+(/[\w\-]+)?$

它允許在tags/后面加一個單詞,后跟一個可選的斜杠和另一個單詞。

在字符類中你不需要+ - 你說唯一允許的字符是alnums和連字符。

完全按照你所說的做,匹配“tags /”后跟“file”或“file / file”。 粗略地說,“tags /(file | file / file)$”。

簡單:

^tags(?:/[\\w+\\-]+){1,2}$

這是一個經過測試的PHP命令行腳本,它實現了正則表達式的注釋版本:

<?php // test.php Rev:20130823_2100
$text = 'tags/how-to-bake/magic_brownies';

$re =   '% # Match path having two or three path segments.
        ^          # Anchor to start of string.
        tags       # Hard code first path segment.
        (?:        # Group 1 or 2 additional segments.
          /        # Path segments separated by /
          [\w+\-]+ # Path segment is one or more [A-Za-z0-9_-].
        ){1,2}     # End group of 1 or 2 additional segments.
        $          # Anchor to end of string.
        %ix';
if (preg_match($re, $text, $matches)) {
    echo("Successful match");
} else {
    echo("No match");
}
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM