2011-03-12 180 views
-1

任何人都可以告诉我为什么这个简单的正则表达式失败?PHP正则表达式帮助需要

$blogurl = 'http://www.sirpi.org/2011/02/23/'; 
if(preg_match("/[0-9]\/[0-9]\/[0-9]\/$/", $blogurl)){ 
    echo "Bad URL\n"; 
} 
+0

如果你解释了这个代码被认为是做什么的,它可能会有所帮助。事实上,该正则表达式永远不会匹配该字符串。 – canuckistani 2011-03-12 09:45:28

回答

1

您似乎试图测试字符串末尾是否有/之间的数字。为此,您可以使用

$blogurl = 'http://www.sirpi.org/2011/02/23/'; 
if(preg_match("/[0-9]+\/[0-9]+\/[0-9]+\/$/", $blogurl)){ 
    echo "Bad URL\n"; 
} 

+表示一个或多个。否则,你只是匹配一个数字,并且URL中的数字不只是单个数字。

您还可以使用\d的数字,而不是[0-9]

$blogurl = 'http://www.sirpi.org/2011/02/23/'; 
if(preg_match("/\d+\/\d+\/\d+\/$/", $blogurl)){ 
    echo "Bad URL\n"; 
} 
+0

谢谢,上面的代码使用\ d +就像一个魅力 – 2011-03-12 10:03:01

1

你匹配此:

one of characters 0-9 
a literal slash ("/") 
one of characters 0-9 
a literal slash ("/") 
one of characters 0-9 
a literal slash ("/") 
end of string 

您可能要匹配年中有一个以上的数字,同样有月和日。

1
/[0-9]\/[0-9]\/[0-9]\/$/ 

正在寻找一个

[0-9] a single digit 
\/ followed by a/
[0-9] a single digit 
\/ followed by a/
[0-9] a single digit 
\/ followed by a/
$  at the end of the string 

尝试

/[0-9]{1,4}\/[0-9]{1,2}\/[0-9]{1,2}\/$/ 

whic试验的每个数字/

0

[0-9]之间的号码相匹配的单个数字。所以这个正则表达式匹配一个数字,一个斜杠,一个数字,一个斜线,一个数字,一个斜杠和一个字符串的结尾。

所以它会匹配4/5/6/,但不匹配11/22/33/

如果你想匹配一个或多个数字,你应该使用[0-9]+。如果您希望匹配零个或多个数字,您还可以使用[0-9]*

0

,因为你正在寻找个位数。试试这个:

"/[0-9]{4}\/[0-9]{2}\/[0-9]{2}\/$/" 
0

另外,如果你想让sub url的东西数量变化,

"/(\/[0-9]+)+\/?$/" 

即,至少一个/接着一串数字,然后任选的精加工/

看起来像你的例子中的网址是日期,所以这可能没有必要。