使用 preg_match_all() 函数验证重写规则行



我正在尝试使用 preg_match_all(( 验证重写规则行,

这是我试图验证的行:

RewriteRule ^(.*)$ /edt.php

到目前为止,这是我的正则表达式模式:

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

最后一个参数 [NC,NE,L,R] 在该行中是可选的。

我用 php 的完整代码

$x="RewriteRule ^(.*)$ /edt.php ";
if(preg_match_all("/RewriteRuless+[^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"部分。我相信模式有问题,我已经浪费了 20mnts 试图自己解决它,但我找不到错误在哪里。

任何帮助都非常感谢。

关于这个问题,我有很多不明白的地方,但我会尽我所能在这里帮助你。

让我们从您的字符串开始:

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. [[A-Z,]+]) 表达式的最后一位只是匹配一个字面的左方括号[,后跟一个由字母或逗号组成的字符类[A-Z,],并要求其中至少有一个+存在。 我用一个结束方括号]结束它,右括号)"或"。

这可以进行相当多的微调,但这里有一个演示供您使用:

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

错误:

你有几个项目,我可以马上说出来会让你的比赛失败。

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

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

最后,您需要在 URL 后留一个空格,即使不存在 RewriteRule 标志也是如此。 可能还有更多,但那些是那些跳出来向我跳出来的。

最新更新