使用 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   

我在我的表达中添加了白色space只是为了让它更容易阅读。此表达式中不应有实际的 space 个字符。

  1. ^RewriteRule 简单匹配短语。我们使用 ^ 将其锚定到行的开头。
  2. \s+ 要求在下一项之前至少有一个 space。这已经是您正在使用的。
  3. .*? 这是一种 catch-all,可以细化到您想要的任何细节。但出于这个目的,我只是说匹配任何字符 .,任意次数 *,直到你点击下一个匹配项 ?。在这种情况下,下一项是白色space字符。
  4. \s+ 在下一个项目之前至少需要一个 space
  5. .*? 匹配任意字符,任意次数直到下一个项目。
  6. (?:$|\s+ 这可能看起来一团糟,但它实际上只是匹配行尾或白色 space 字符。 (?: 由两部分组成 只是说开始一个新组 (,但不记得了 ?:。我在后面加上一行结尾 $| a space \s+.
  7. \[[A-Z,]+\]) 表达式的最后一位只是匹配文字左方括号 [,后跟由字母或逗号 [A-Z,] 组成的字符 class并要求至少其中之一在场 +。我用结束方括号 ] 和 "or".
  8. 的右括号 ) 结束它

这可能 fine-tuned 很多,但这里有一个演示供您试用:

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

错误:

你有几项我可以马上告诉你会打败你的比赛。

我看到您正在检查 RewriteRules 而不是 RewriteRule

此外,您正在像这样 [NC,NE,L,R] 匹配方括号中的 RewriteRule 标志。方括号是正则表达式中的特殊字符,因此您实际上是在尝试匹配一个可选的单个字符,该字符必须是逗号或以下字母之一:NCELR

最后,即使不存在 RewriteRule 标志,您也需要在 URL 之后添加 space。可能还有更多,但那些是我跳出来的。