![](/img/trans.png)
[英]How to get a new line from peragraph using preg_match_all function in php?
[英]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
我在表达式中添加了空格,只是为了使其更易于阅读。 此表达式中不应有实际的空格字符。
^RewriteRule
只需匹配短语。 我们使用^
将其锚定到行的开头。 \\s+
在下一项之前至少需要一个空格。 这已经是您正在使用的。 .*?
这是一个万能的,可以细化为您想要的任何细节。 但是为此,我只是说要匹配任何字符.
多少次*
,直到您找到下一个要匹配的项目?
。 在这种情况下,下一项是空白字符。 \\s+
在下一项之前至少需要一个空格 .*?
匹配任何字符,任意次数,直到下一项。 (?:$|\\s+
这看起来像是一团糟,但实际上只是匹配行尾或空白字符。 (?:
?:由两部分组成,它们只是说要开始一个新的组(
,但不记得了?:
。我在后面跟随以$
或|
结尾的行\\s+
。 \\[[AZ,]+\\])
表达式的最后一点是简单地匹配一个文字右方括号[
,然后是一个由字母或逗号[AZ,]
组成的字符类[AZ,]
并要求至少其中一个为现在+
。 我用一个结尾的方括号[ ]
和“或”的右括号( )
封闭了它。 可以对它进行微调,但是这里有一个演示供您试用:
https://regex101.com/r/qF7bP6/1
错误:
我有几个可以立即告诉您的项目将使您的比赛失败。
我可以看到您正在检查RewriteRules
而不是RewriteRule
。
此外,您正在像这样[NC,NE,L,R]
方括号中匹配RewriteRule标志。 方括号在正则表达式中是特殊字符,因此您实际上是在尝试匹配可选的单个字符,该字符必须是逗号或以下字母之一: N
, C
, E
, L
或R
最后,即使没有RewriteRule标志,您也需要在URL后留一个空格。 可能还有更多,但是那些是跳到我身上的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.