2009-10-02 47 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