2012-02-19 29 views
2

所以這就是我使用preg_match將瀏覽器中的當前URI與我的router.php配置文件中定義的URL進行匹配的問題。我建立類似於Django的Router/Dispatcher。PHP的preg_match,如何捕獲只命名的正則表達式?

我想要的是,preg_match()只捕獲$ matches變量中的命名正則表達式。

所以如果我有regexs這樣的:

^(?<param1>[a-z]+(?:\-[a-z]+)*)\.domain\.com\/[a-z]+(?:\/)?(?<param2>[a-z]+)?\/?$ 

Rubural鏈接:CLICK

當我比較當前URI與此regexs匹配,但$變量返回此匹配:

array (0 => 'sub.domain.com/page/pageurl/', 'param1' => 'sub', 1 => 'sub', 'param2' => 'pageurl', 2 => 'pageurl',) 

是否可以告知preg_match()僅返回指定的匹配項,並排除那些數字,我想得到的是關聯數組:)

我可以使用foreach()並通過$匹配循環,然後在裏面檢查它的數字或不...有沒有更好的辦法?

感謝

+2

沒有一個'array_filter_keys'功能,所以你可能是最好的只是做循環。 – lonesomeday 2012-02-19 21:52:09

+0

array_filter_keys可以這樣做:'array_intersect_key($ matches,array_flip(array('param1','param2')))' – 2012-06-29 14:51:36

回答

4

我無法找到有關擺在首位命名子模式的PHP手冊什麼,但我會採取一種猜測,說你不能防止數字鍵產生陣列。

這種猜測的理由是鑰匙0始終包含完整匹配,並且沒有匹配的命名方式。

如果你想刪除數字指數,最好的方法可能是foreach循環。

+1

http://php.net/manual/en/regexp.reference.subpatterns.php>可以使用語法命名子模式(?P 模式)。然後,這個子模式將通過正常的數字位置和名稱在匹配數組中進行索引。 PHP 5.2.2引入了兩種替代語法(?模式)和(?'name'pattern)。' – Vyktor 2012-02-19 21:59:51

+0

感謝球員們,il留下了索引值和聯想值。誰知道誰會使用這個Dispatcher,所以最好留下這兩個選項。 – Limeni 2012-02-19 22:04:02

1

試試這個代碼:

$namedFields = array_filter(array_keys($matches), "is_string"); 
+0

以上不適合我。相反,請嘗試:array_filter($ matches,「is_string」,ARRAY_FILTER_USE_KEY); – Cedric 2017-09-15 09:53:34

0
$row = array_intersect_key(
     $matches,      // 4. "filling" flipped key array with actual values 
     array_flip(     // 3. fliping array 
      array_filter(   // 2. keeping string keys 
       array_keys($matches), // 1. taking keys 
       "is_string"))); 

也php5.6你可以使用array_filter

$row = array_filter(
    $matches, 
    'is_string', 
    ARRAY_FILTER_USE_KEY 
);