簡體   English   中英

使用preg_match_all()函數驗證RewriteRule行

[英]Validating a RewriteRule line using preg_match_all() function

我正在嘗試使用preg_match_all()驗證RewriteRule行,

這是我要驗證的行:

RewriteRule ^(.*)$ /edt.php

到目前為止,這是我的正則表達式模式:

RewriteRules\s+[^s]+\s+[^s]+\s+([NC,NE,L,R])?/i

該行中的最后一個參數[NC,NE,L,R]是可選的。

我用PHP完成的代碼

$x="RewriteRule ^(.*)$ /edt.php ";

if(preg_match_all("/RewriteRules\s+[^s]+\s+[^s]+\s+([NC,NE,L,R])?/i",$x,$m))
{echo "Line is ok";}
else
{echo "There is something wrong with the line";}

這是行不通的,我在輸出中得到了代碼的“ else”部分。 我相信該模式有問題,我已經浪費了20百萬次嘗試自己解決它,但是我找不到錯誤所在。

任何幫助都非常有用。

關於這個問題,我有很多我不了解的地方,但是我會盡力幫助您。

讓我們從您的字符串開始:

RewriteRule ^(.*)$ /edt.php

這可以通過多種方式進行匹配,但是我將為您提供一種通用的實現方法,並向您展示一些潛在的錯誤。

好像您只是在匹配這樣的模式:

RewriteRule SPACE SOMETHING SPACE SOMETHING SPACE OPTIONAL_DATA_WITH BRACKETS
      1       2       3       4       5       6                 7

這是與此匹配的正則表達式:

^RewriteRule  \s+  .*?  \s+  .*?  (?:$|\s+  \[[A-Z,]+\])
     1         2    3    4    5       6           7   

我在表達式中添加了空格,只是為了使其更易於閱讀。 此表達式中不應有實際的空格字符。

  1. ^RewriteRule只需匹配短語。 我們使用^將其錨定到行的開頭。
  2. \\s+在下一項之前至少需要一個空格。 這已經是您正在使用的。
  3. .*? 這是一個萬能的,可以細化為您想要的任何細節。 但是為此,我只是說要匹配任何字符. 多少次* ,直到您找到下一個要匹配的項目? 在這種情況下,下一項是空白字符。
  4. \\s+在下一項之前至少需要一個空格
  5. .*? 匹配任何字符,任意次數,直到下一項。
  6. (?:$|\\s+這看起來像是一團糟,但實際上只是匹配行尾或空白字符。 (?: ?:由兩部分組成,它們只是說要開始一個新的組( ,但不記得了?: 。我在后面跟隨以$|結尾的行\\s+
  7. \\[[AZ,]+\\])表達式的最后一點是簡單地匹配一個文字右方括號[ ,然后是一個由字母或逗號[AZ,]組成的字符類[AZ,]並要求至少其中一個為現在+ 我用一個結尾的方括號[ ]和“或”的右括號( )封閉了它。

可以對它進行微調,但是這里有一個演示供您試用:

https://regex101.com/r/qF7bP6/1

錯誤:

我有幾個可以立即告訴您的項目將使您的比賽失敗。

我可以看到您正在檢查RewriteRules而不是RewriteRule

此外,您正在像這樣[NC,NE,L,R]方括號中匹配RewriteRule標志。 方括號在正則表達式中是特殊字符,因此您實際上是在嘗試匹配可選的單個字符,該字符必須是逗號或以下字母之一: NCELR

最后,即使沒有RewriteRule標志,您也需要在URL后留一個空格。 可能還有更多,但是那些是跳到我身上的。

暫無
暫無

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

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