使用 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 个字符。
^RewriteRule
简单匹配短语。我们使用 ^
将其锚定到行的开头。
\s+
要求在下一项之前至少有一个 space。这已经是您正在使用的。
.*?
这是一种 catch-all,可以细化到您想要的任何细节。但出于这个目的,我只是说匹配任何字符 .
,任意次数 *
,直到你点击下一个匹配项 ?
。在这种情况下,下一项是白色space字符。
\s+
在下一个项目之前至少需要一个 space
.*?
匹配任意字符,任意次数直到下一个项目。
(?:$|\s+
这可能看起来一团糟,但它实际上只是匹配行尾或白色 space 字符。 (?:
由两部分组成 只是说开始一个新组 (
,但不记得了 ?:
。我在后面加上一行结尾 $
或 |
a space \s+
.
\[[A-Z,]+\])
表达式的最后一位只是匹配文字左方括号 [
,后跟由字母或逗号 [A-Z,]
组成的字符 class并要求至少其中之一在场 +
。我用结束方括号 ]
和 "or". 的右括号 )
结束它
这可能 fine-tuned 很多,但这里有一个演示供您试用:
https://regex101.com/r/qF7bP6/1
错误:
你有几项我可以马上告诉你会打败你的比赛。
我看到您正在检查 RewriteRules
而不是 RewriteRule
。
此外,您正在像这样 [NC,NE,L,R]
匹配方括号中的 RewriteRule 标志。方括号是正则表达式中的特殊字符,因此您实际上是在尝试匹配一个可选的单个字符,该字符必须是逗号或以下字母之一:N
、C
、E
、L
或 R
。
最后,即使不存在 RewriteRule 标志,您也需要在 URL 之后添加 space。可能还有更多,但那些是我跳出来的。
我正在尝试使用 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 个字符。
^RewriteRule
简单匹配短语。我们使用^
将其锚定到行的开头。\s+
要求在下一项之前至少有一个 space。这已经是您正在使用的。.*?
这是一种 catch-all,可以细化到您想要的任何细节。但出于这个目的,我只是说匹配任何字符.
,任意次数*
,直到你点击下一个匹配项?
。在这种情况下,下一项是白色space字符。\s+
在下一个项目之前至少需要一个 space.*?
匹配任意字符,任意次数直到下一个项目。(?:$|\s+
这可能看起来一团糟,但它实际上只是匹配行尾或白色 space 字符。(?:
由两部分组成 只是说开始一个新组(
,但不记得了?:
。我在后面加上一行结尾$
或|
a space\s+
.\[[A-Z,]+\])
表达式的最后一位只是匹配文字左方括号[
,后跟由字母或逗号[A-Z,]
组成的字符 class并要求至少其中之一在场+
。我用结束方括号]
和 "or". 的右括号
)
结束它
这可能 fine-tuned 很多,但这里有一个演示供您试用:
https://regex101.com/r/qF7bP6/1
错误:
你有几项我可以马上告诉你会打败你的比赛。
我看到您正在检查 RewriteRules
而不是 RewriteRule
。
此外,您正在像这样 [NC,NE,L,R]
匹配方括号中的 RewriteRule 标志。方括号是正则表达式中的特殊字符,因此您实际上是在尝试匹配一个可选的单个字符,该字符必须是逗号或以下字母之一:N
、C
、E
、L
或 R
。
最后,即使不存在 RewriteRule 标志,您也需要在 URL 之后添加 space。可能还有更多,但那些是我跳出来的。