Ben Sinclair
Ben Sinclair

Reputation: 3986

Preg_match help : selecting files in a folder

I have the following code that selects all the different template files out of a folder... The file names I have are:

template_default.php

template_default_load.php

template_sub.php

template_sub_load.php

I only want to select the ones without the _load in the file name so I used this code:

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

The code works fine except it cuts the last character off the result... Instead of returning default or sub when I echo $layout_name[1], it shows defaul and su...

Any ideas what is wrong with my code?

Upvotes: 0

Views: 390

Answers (2)

Josh Davis
Josh Davis

Reputation: 28730

You'll have to use negative assertions. (read below why not)

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

Edit: come to think of it, that regexp won't actually work because "_load" will be consumed by the .*? part. My advice: don't use preg_match() to capture the name, use it to skip those that end with _load, e.g.

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_'));
}

Upvotes: 0

too much php
too much php

Reputation: 91058

This part is totally up the creek:

[^[_load]]{0}

This is the regex you want:

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

Upvotes: 2

Related Questions