繁体   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