Preg_match help: выбор файлов в папке - PullRequest
0 голосов
/ 02 октября 2009

У меня есть следующий код, который выбирает все разные файлы шаблонов из папки ... У меня есть имена файлов:

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)

Код работает нормально, за исключением того, что он обрезает последний символ результата ... Вместо того, чтобы возвращать default или sub, когда я повторяю $ layout_name [1], он показывает defaul и su ...

Есть идеи, что не так с моим кодом?

Ответы [ 2 ]

2 голосов
/ 02 октября 2009

Эта часть полностью до ручья:

[^[_load]]{0}

Это регулярное выражение, которое вы хотите:

/^template_(.*)(?<!_load)\.php$/i
0 голосов
/ 02 октября 2009

Вам придется использовать отрицательные утверждения . (см. Ниже, почему нет)

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_'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...