![](/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.