2009-10-02 1 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) 

Edit: приходите думать об этом, что регулярное выражение не будет реально работать, потому что «_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

Это не работает. Вместо этого вам нужно вместо этого использовать отрицательное утверждение. –

+0

Да, я не думал об этом правильно. Несмотря на то, что вы хотите захватить то, за чем не следует подстрока, вам нужно искать что-то другое, которому не предшествует. –

Смежные вопросы