Root/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | <?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Finder; /** * Glob matches 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"; * } * * Glob implements glob(3) style matching that can be used to match * against text, rather than fetching names from a filesystem. * * Based on the Perl Text::Glob module. * * @author Fabien Potencier <fabien@symfony.com> PHP port * @author Richard Clamp <richardc@unixbeard.net> Perl version * @copyright 2004-2005 Fabien Potencier <fabien@symfony.com> * @copyright 2002 Richard Clamp <richardc@unixbeard.net> */ class Glob { /** * Returns a regexp which is the equivalent of the glob pattern. * * @param string $glob The glob pattern * @param bool $strictLeadingDot * @param bool $strictWildcardSlash * * @return string regex The regexp */ public static function toRegex( $glob , $strictLeadingDot = true, $strictWildcardSlash = true) { $firstByte = true; $escaping = false; $inCurlies = 0; $regex = '' ; $sizeGlob = strlen ( $glob ); for ( $i = 0; $i < $sizeGlob ; $i ++) { $car = $glob [ $i ]; if ( $firstByte ) { if ( $strictLeadingDot && '.' !== $car ) { $regex .= '(?=[^\.])' ; } $firstByte = false; } if ( '/' === $car ) { $firstByte = true; } if ( '.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car ) { $regex .= "\\$car" ; } elseif ( '*' === $car ) { $regex .= $escaping ? '\\*' : ( $strictWildcardSlash ? '[^/]*' : '.*' ); } elseif ( '?' === $car ) { $regex .= $escaping ? '\\?' : ( $strictWildcardSlash ? '[^/]' : '.' ); } elseif ( '{' === $car ) { $regex .= $escaping ? '\\{' : '(' ; if (! $escaping ) { ++ $inCurlies ; } } elseif ( '}' === $car && $inCurlies ) { $regex .= $escaping ? '}' : ')' ; if (! $escaping ) { -- $inCurlies ; } } elseif ( ',' === $car && $inCurlies ) { $regex .= $escaping ? ',' : '|' ; } elseif ( '\\' === $car ) { if ( $escaping ) { $regex .= '\\\\' ; $escaping = false; } else { $escaping = true; } continue ; } else { $regex .= $car ; } $escaping = false; } return '#^' . $regex . '$#' ; } } |