我正在使用路徑重定向某些 url 以獲取如下變數:
localhost2/post/myTitle => localhost2/post.php?title=myTitle
localhost2/post/123 => localhost2/post.php?id=123
所以在我的 htaccess 檔案中,我使用
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^post/(\d ) post.php?id=$1
RewriteRule ^post/(.*) post.php?title=$1
</IfModule>
這沒有問題。但我想學習如何寫否定的^post/(\d ),那就是^post/(NEGATE-ONLY-NUMBERS)。換句話說,我想要一個匹配整個輸入字串的正則運算式,如果post/. 所以post/abc, post/a23, post/ab3,post/12c和post/a2c應該都通過但不是post/123。我參考了這篇文章,建議使用:
(?!^\d $)^. $
我不能用^post/(?!^\d $)^. $,因為只能有一個^和一個$。我不知道什么正則運算式錨指定了子字串中的第一個位置。我最好的猜測是
post\/(?!\d ).*
我認為(?!\d ), 會吃掉所有字符 followig 并檢查是否都是數字。但這在post/1ab.
另一種猜測是:
post\/(?![\d,\/] $).*
作品中最好的,但它允許:post/3455/X。其次,最終我也需要轉換localhost2/post/myTitle/123 => localhost2/post.php?title=myTitle&repeat=123。我想出了以下幾點:
^post/(?!\d ($|/))(. ?($|/))(\d $)?
注意: ?要使用惰性量詞,否則多個斜線將被匹配.
和
^post/(?!\d ($|/))([^/\n\r] ($|/))(\d $)?
這里我用[^/\n\r]代替. ?
uj5u.com熱心網友回復:
零寬度斷言中的模式(?!\d ) 是非消耗性的,它們不“吃”字符,它們只檢查背景關系,同時將正則運算式索引保持在與匹配零寬度斷言模式之前相同的位置。
您可以使用以下任何一種:
^post/(?!\d (?:/|$)).*
^post/(?!\d (?=/|$)).*
^post/(?!\d (?![^/])).*
請參閱正則運算式演示。詳情:
^post/- 輸入開始,post/文字字串(?!\d (?=/|$))- 如果在當前位置的右側,有一個或多個數字后跟/或字串結尾,則匹配失敗的負前瞻.*- 其余的輸入。
uj5u.com熱心網友回復:
當您可以通過保留 3 個單獨的重寫規則來使事情變得簡單并且由于您的查詢引數的命名不同時,請不要使事情過于復雜,因此無論如何您都需要 3 個單獨的重寫規則。
考慮:
Options -MultiViews
RewriteEngine On
RewriteRule ^post/(\d ) post.php?id=$1 [L,QSA,NC]
RewriteRule ^post/(.*) post.php?title=$1 [L,QSA,NC]
RewriteRule ^post/([^/] )/(\d ) localhost2/post.php?title=$1&repeat=$2 [L,QSA,NC]
注意Options -MultiViews. 如果這在 Apache 配置中沒有啟用,你必須在這里設定它,否則它會使$_GET你的 php 檔案中的所有引數都為空。
選項MultiViews(參見http://httpd.apache.org/docs/2.4/content-negotiation.html)由之前Apache's content negotiation module運行的選項使用,并使 Apache 服務器匹配檔案的擴展名。因此,如果是 URL,則 Apache 將提供. mod_rewrite/file/file.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/401071.html
下一篇:正則運算式-如何匹配所有電話格式
