Skip to content

Latest commit

 

History

History
178 lines (126 loc) · 5.38 KB

README.md

File metadata and controls

178 lines (126 loc) · 5.38 KB

Webmozart Glob

Build Status Scrutinizer Code Quality SensioLabsInsight Latest Stable Version Total Downloads Dependency Status

Latest release: 2.0.1

A utility implementing Ant-like globbing.

Syntax:

  • * matches zero or more characters, except /
  • /**/ matches zero or more directory names
  • {ab,cd} matches ab or cd

API Documentation

Installation

Use Composer to install the package:

$ composer require webmozart/glob:^2.0

Usage

The main class of the package is Glob. Use Glob::glob() to glob the filesystem:

use Webmozart\Glob\Glob;

$paths = Glob::glob('/path/to/dir/*.css'); 

You can also use GlobIterator to search the filesystem iteratively. However, the iterator is not guaranteed to return sorted results:

use Webmozart\Glob\Iterator\GlobIterator;

$iterator = new GlobIterator('/path/to/dir/*.css');

foreach ($iterator as $path) {
    // ...
}

Path Matching

The package also provides utility methods for comparing paths against globs. Use Glob::match() to match a path against a glob:

if (Glob::match($path, '/path/to/dir/*.css')) {
    // ...
}

Glob::filter() filters a list of paths by a glob:

$paths = Glob::filter($paths, '/path/to/dir/*.css');

The same can be achieved iteratively with GlobFilterIterator:

use Webmozart\Glob\Iterator\GlobFilterIterator;

$iterator = new GlobFilterIterator('/path/to/dir/*.css', new ArrayIterator($paths));

foreach ($iterator as $path) {
    // ...
}

Relative Globs

Relative globs such as *.css are not supported. Usually, such globs refer to paths relative to the current working directory. This utility, however, does not want to make such assumptions. Hence you should always pass absolute globs.

If you want to allow users to pass relative globs, I recommend to turn the globs into absolute globs using the Webmozart Path Utility:

use Webmozart\Glob\Glob;
use Webmozart\PathUtil\Path;

// If $glob is absolute, that glob is used without modification.
// If $glob is relative, it is turned into an absolute path based on the current
// working directory.
$paths = Glob::glob(Path::makeAbsolute($glob, getcwd());

Windows Compatibility

Globs need to be passed in canonical form with forward slashes only. Returned paths contain forward slashes only.

Escaping

The Glob class supports a mode where you can match files that actually contain a *, { or } in their filename. To enable the escape mode, pass the Glob::ESCAPE flag to any of the methods in Glob.

$paths = Glob::glob('/backup\\*/*.css', Glob::ESCAPE);

In the previous example, the glob matches all CSS files in the /backup* directory rather than in all directories starting with /backup. Due to PHP's own escaping in strings, the backslash character \ needs to be typed twice to produce a single \ in the string.

The following escape sequences are available:

  • \\*: match a * in the path
  • \\{: match a { in the path
  • \\}: match a } in the path
  • \\\\: match a \ in the path

Stream Wrappers

The Glob class supports stream wrappers:

$paths = Glob::glob('myscheme:///**/*.css');

Authors

Contribute

Contributions to the package are always welcome!

Support

If you are having problems, send a mail to bschussek@gmail.com or shout out to @webmozart on Twitter.

License

All contents of this package are licensed under the MIT license.