php port * @author Richard Clamp perl version * @copyright 2004-2005 Fabien Potencier * @copyright 2002 Richard Clamp * @license see the LICENSE file included in the distribution * @version SVN: $Id: pakeGlobToRegex.class.php 1791 2006-08-23 21:17:06Z fabien $ */ if (class_exists('pakeGlobToRegex')) { return; } /** * * Match globbing patterns against text. * * if match_glob("foo.*", "foo.bar") echo "matched\n"; * * // prints foo.bar and foo.baz * $regex = glob_to_regex("foo.*"); * for (array('foo.bar', 'foo.baz', 'foo', 'bar') as $t) * { * if (/$regex/) echo "matched: $car\n"; * } * * pakeGlobToRegex implements glob(3) style matching that can be used to match * against text, rather than fetching names from a filesystem. * * based on perl Text::Glob module. * * @package pake * @author Fabien Potencier php port * @author Richard Clamp perl version * @copyright 2004-2005 Fabien Potencier * @copyright 2002 Richard Clamp * @license see the LICENSE file included in the distribution * @version SVN: $Id: pakeGlobToRegex.class.php 1791 2006-08-23 21:17:06Z fabien $ */ class pakeGlobToRegex { private static $strict_leading_dot = true; private static $strict_wildcard_slash = true; public static function setStrictLeadingDot($boolean) { self::$strict_leading_dot = $boolean; } public static function setStrictWildcardSlash($boolean) { self::$strict_wildcard_slash = $boolean; } /** * Returns a compiled regex which is the equiavlent of the globbing pattern. * * @param string glob pattern * @return string regex */ public static function glob_to_regex($glob) { $first_byte = true; $escaping = false; $in_curlies = 0; $regex = ''; for ($i = 0; $i < strlen($glob); $i++) { $car = $glob[$i]; if ($first_byte) { if (self::$strict_leading_dot && $car != '.') { $regex .= '(?=[^\.])'; } $first_byte = false; } if ($car == '/') { $first_byte = true; } if ($car == '.' || $car == '(' || $car == ')' || $car == '|' || $car == '+' || $car == '^' || $car == '$') { $regex .= "\\$car"; } else if ($car == '*') { $regex .= ($escaping ? "\\*" : (self::$strict_wildcard_slash ? "[^/]*" : ".*")); } else if ($car == '?') { $regex .= ($escaping ? "\\?" : (self::$strict_wildcard_slash ? "[^/]" : ".")); } else if ($car == '{') { $regex .= ($escaping ? "\\{" : "("); if (!$escaping) ++$in_curlies; } else if ($car == '}' && $in_curlies) { $regex .= ($escaping ? "}" : ")"); if (!$escaping) --$in_curlies; } else if ($car == ',' && $in_curlies) { $regex .= ($escaping ? "," : "|"); } else if ($car == "\\") { if ($escaping) { $regex .= "\\\\"; $escaping = false; } else { $escaping = true; } continue; } else { $regex .= $car; $escaping = false; } $escaping = false; } return "#^$regex$#"; } }