2011-10-22 67 views
0

我一直在挖掘codeigniter幾個小時。我在路由器類中發現了一些不同的正則表達式。正則表達式中特殊字符的含義

preg_match('#^'.$key.'$#', $uri); 
preg_replace('#^'.$key.'$#', $val, $uri); 

我做了如下測試php文件:

<?php 

$route['login'] = 'user/login'; 
$route['user/([a-zA-Z-]+)'] = 'user/profile/$1'; 

$uri = 'user/asfd'; 

foreach ($route as $key => $val) 
{ 
    if (preg_match('#^'.$key.'$#', $uri)) 
    { 
     echo preg_replace('#^'.$key.'$#', $val, $uri); 
    } 
} 

它正確地給

user/profile/asfd 

什麼我不明白這裏是#^和$#使用。我抓取網絡找到一些解釋,但沒有運氣。

回答

5

在這種情況下,#的開始和結尾是正則表達式的分隔符。您可能以前看過他們的作品/,但可以使用許多不同的字符。它們僅僅表示正則表達式模式的開始和結束,並可能跟着額外的正則表達式選項,如不區分大小寫(i),全局匹配(g)等(儘管preg_match_all()用於代替PHP中的g標誌)

因此,匹配的實際模式是^$key$。即,要匹配的字符串的開頭,值$key和字符串的結尾。

可能的原因在這個表達式選擇#代替/作爲分隔符的是,它不需要用\逃脫URI模式的斜線。

2

它們是regex delimiters,如PHP手冊中所述。 preg_ *函數來自PCRE(Perl Compatible Regular Expression)庫。 Perl支持文字正則表達式,使用正則表達式分隔符而非字符串如何使用單引號和雙引號。 PHP不支持文字正則表達式,但該庫仍然需要分隔符。