2013-05-09 71 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]$這是目前結束分隔符之後,使其裏面。

這應該解決問題。