2009-10-02 75 views
0

在選擇文件我有以下的代碼,選擇所有不同的模板文件從一個文件夾...文件名我有是:的preg_match幫助:一個文件夾

template_default.php

template_default_load。 PHP

template_sub.php

template_sub_load.php

我只希望選擇那些沒有在網絡連接的_Load文件名,所以我用這個代碼:

preg_match('/^template_(.*)[^[_load]]{0}\.php$/i', $layout_file, $layout_name) 

的代碼工作正常,除了它減少的最後一個字符不在結果......而不是返回默認或子的時候我回聲$ LAYOUT_NAME [1],它顯示defaul和su ...

任何想法我的代碼有什麼問題?

回答

2

這部分完全由小溪:

[^[_load]]{0} 

這是你想要的正則表達式:

/^template_(.*)(?<!_load)\.php$/i 
0

你將不得不使用negative assertions(閱讀下面爲什麼不)

preg_match('/^template_(.*?)(?!_load)\.php$/i', $layout_file, $layout_name) 

編輯:想起來了,這正則表達式實際上不會工作,因爲「_Load」將由.*?一部分被消耗。我的建議是:不要使用preg_match()來捕獲名稱,用它來跳過以_load結尾的名稱,例如

foreach (glob('template_*') as $filepath) 
{ 
    if (preg_match('#_load\\.php$', $filepath)) 
    { 
     // The file ends with _load 
    } 
    $filename = basename($filepath); 
    $layout_name = substr($filename, strlen('template_')); 
} 
+0

這是行不通的。您需要使用後視否定斷言。 – 2009-10-02 03:23:12

+0

是的,我沒有正確的想法。即使你想捕獲一些沒有被子字符串跟蹤的東西,你也必須尋找其他東西不在其後面的東西。 – 2009-10-02 03:33:01