Solved

PHP/REGEX: Where file names do not have underscore with glob

Posted on 2016-09-29
8
69 Views
Last Modified: 2016-09-30
$f = glob('files/courses/{*_[0-9]*.zip}', GLOB_BRACE);

Open in new window

This matches:
x_123.zip
y_543.zip
z_789.zip

But it does not match:
x123.zip
y543.zip
z789.zip

How can I get it to match:
x123.zip
y543.zip
z789.zip

but not:
x_123.zip
y_543.zip
z_789.zip
?
0
Comment
Question by:skij
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
  • 2
  • +1
8 Comments
 
LVL 35

Expert Comment

by:gr8gonzo
ID: 41822162
add a ? after the _
0
 
LVL 10

Author Comment

by:skij
ID: 41822180
I don't want these to match!
x_123.zip
y_543.zip
z_789.zip

If there is a _ before the number then it should not match.
0
 
LVL 35

Assisted Solution

by:Dan Craciun
Dan Craciun earned 50 total points
ID: 41822254
$f = glob('files/courses/{[^_]+[0-9]*.zip}', GLOB_BRACE);

HTH,
Dan
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 35

Expert Comment

by:gr8gonzo
ID: 41822360
{[a-zA-Z0-9]+.zip}
0
 
LVL 10

Author Comment

by:skij
ID: 41822819
Please look carefully at the examples I gave in my original post.

None of the ideas work with the examples provided.
0
 
LVL 35

Assisted Solution

by:gr8gonzo
gr8gonzo earned 150 total points
ID: 41822884
Sorry - I was trying to get back a quick response earlier. I have a few more minutes now and I can tell you that glob() doesn't have a full regex engine, which will make it pretty difficult to do any sort of complex filtering in the future.

So if those are truly the filenames, then this should work:
$f = glob('files/courses/[a-z][0-9]*.zip');

But I'd recommend you set yourself up for success later on and put in a quick use of the full regex engine using preg_match to filter the results that come back:

$f = glob('files/courses/*[0-9]*.zip');
foreach($f as $fk => $fv) { if(!preg_match("/^[a-zA-Z][0-9]+.zip/",basename($fv))) { unset($f[$fk]); } }
0
 
LVL 57

Accepted Solution

by:
Julian Hansen earned 300 total points
ID: 41823004
glob is actually quite a slow function - especially if you are going to iterate through the results afterwards.
Try the FileSystemIterator instead

$regex = "/^[a-zA-Z]+[0-9]+\.zip$/";
$path = 'files/courses';

$iterator = new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS + FilesystemIterator::CURRENT_AS_PATHNAME + FilesystemIterator::KEY_AS_FILENAME);
$desirable = array();
foreach ($iterator as $key => $filepath) {
  if (preg_match($regex, $key)) {
    $desirable[] = $filepath;
  }
}

Open in new window

EDIT
Changed to use KEY_AS_FILENAME to remove requirement for basename - 50% faster.
0
 
LVL 57

Expert Comment

by:Julian Hansen
ID: 41823007
For interest FSI ran in approx 1/5 of the time of the glob solution.
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Generating table dynamically is the most common issue faced by php developers.... So it seems there is a need of an article that explains the basic concept of generating tables dynamically. It just requires a basic knowledge of html and little maths…
Author Note: Since this E-E article was originally written, years ago, formal testing has come into common use in the world of PHP.  PHPUnit (http://en.wikipedia.org/wiki/PHPUnit) and similar technologies have enjoyed wide adoption, making it possib…
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …

717 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question