2013-05-09 78 views
0

我想在PHP中使用preg_match来测试一个URL的格式。该URL看起来是这样的:如何preg_match在url中的特定模式?

/2013/09/05/item-01.html 

我试图得到这个工作:

if (preg_match("/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/[.]+[.html]$", $_SERVER['REQUEST_URI'])) : 
    echo "match"; 
endif; 

可是事情并不完全正确。有任何想法吗?

+0

**“不完全正确”是什么意思?**“不完全正确”是我们理解问题的不充分描述。当你尝试时发生了什么?你得到不正确的结果了吗?你有没有得到结果?如果结果不正确,是什么使它们不正确?你想要什么呢?你有没有得到任何正确的结果?如果是这样,他们是什么?不要让我们猜测。 – 2013-05-09 13:58:37

+0

对不起。 “不完全正确”我的意思是它没有匹配,但我觉得我很接近! – user2366298 2013-05-09 14:04:34

回答

0

尝试:

if (preg_match('!\d{4}/\d{2}/\d{2}/.*\.html$!', $_SERVER['REQUEST_URI'])) { 
    echo 'match'; 
} 

\d是短期的[0-9],你可以使用不同的开始/结束分隔符(我用在这种情况下!),使正则表达式更具可读性,当你试图匹配斜杠。

+0

这很好,谢谢! – user2366298 2013-05-09 14:13:29

0

看起来你与你有什么接近正确的,虽然你有一些小问题

  1. 你忘了逃避你最后一个“/”的page.html中前
  2. 的[。] +应该是[^。] +,你不是在寻找一个或多个时期,你正在寻找任何不是一个时期。
  3. 你不应该被使用[]匹配的HTML,而是()或者什么也不
 
if (preg_match("/([0-9]{4})\/([0-9]{2})\/([0-9]{2})\/([^.]+.html)$", $_SERVER['REQUEST_URI'])) : 
    echo "match"; 
endif; 

而且你应该学会什么时候使用(),这些都是用来确保你在存储任何匹配的内容。在你的情况下,我不确定是否要将每个目录存储到文件中。

+0

感谢您发布解决方案,并给出明确的解释。 – user2366298 2013-05-09 14:14:49

0

我的猜测是你有一个文件的工作表达式路径,并且当你试图添加文件名部分时,它停止工作。

preg_match()需要指定一对分隔字符;一个在表达的每一端。它看起来像你有这些,但你已经在分隔符的以外的字符串的末尾添加了一点额外的表达(即文件名)。这是无效的。

"/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/[.]+[.html]$" 
^        ^
your start delimiter    your end delimiter 

您需要将表达式代码[.]+[.html]$这是目前结束分隔符之后,使其里面。

这应该解决问题。