我正在尝试使用 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
我在表达式中添加了空格,只是为了使其更易于阅读。 此表达式中不应有实际的空格字符。
-
^RewriteRule
简单地匹配短语。 我们使用^
将其锚定到行的开头。 -
s+
在下一项之前至少需要一个空格。 这已经是您正在使用的。 -
.*?
这是一种包罗万象的东西,可以细化到您想要的任何细节。 但出于这个目的,我只是说匹配任何角色.
,*
任何次数,直到你点击下一个项目来匹配?
。 在这种情况下,下一项是空格字符。 -
s+
在下一项之前至少需要一个空格 -
.*?
匹配任何字符,任意次数,直到下一项。 -
(?:$|s+
这可能看起来一团糟,但它实际上只是匹配行尾或空格字符。(?:
由两部分组成,只是说要开始一个新的小组(
,但?:
不记得了。 我接下来是一行以$
结尾或|
空格s+
. -
[[A-Z,]+])
表达式的最后一位只是匹配一个字面的左方括号[
,后跟一个由字母或逗号组成的字符类[A-Z,]
,并要求其中至少有一个+
存在。 我用一个结束方括号]
结束它,右括号)
"或"。
这可以进行相当多的微调,但这里有一个演示供您使用:
https://regex101.com/r/qF7bP6/1
错误:
你有几个项目,我可以马上说出来会让你的比赛失败。
我可以看到您正在检查RewriteRules
而不是RewriteRule
.
此外,您正在匹配方括号中的重写规则标志,如下所示[NC,NE,L,R]
。 方括号是正则表达式中的特殊字符,因此您实际上是在尝试匹配可选的单个字符,该字符必须是逗号或以下字母之一:N
、C
、E
、L
或R
。
最后,您需要在 URL 后留一个空格,即使不存在 RewriteRule 标志也是如此。 可能还有更多,但那些是那些跳出来向我跳出来的。