You are here

class Glob in Database Sanitize 7

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>

Hierarchy

  • class \Symfony\Component\Finder\Glob

Expanded class hierarchy of Glob

2 files declare their use of Glob
FilenameFilterIterator.php in vendor/symfony/finder/Iterator/FilenameFilterIterator.php
GlobTest.php in vendor/symfony/finder/Tests/GlobTest.php

File

vendor/symfony/finder/Glob.php, line 36

Namespace

Symfony\Component\Finder
View source
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
   * @param string $delimiter           Optional delimiter
   *
   * @return string regex The regexp
   */
  public static function toRegex($glob, $strictLeadingDot = true, $strictWildcardSlash = true, $delimiter = '#') {
    $firstByte = true;
    $escaping = false;
    $inCurlies = 0;
    $regex = '';
    $sizeGlob = \strlen($glob);
    for ($i = 0; $i < $sizeGlob; ++$i) {
      $car = $glob[$i];
      if ($firstByte && $strictLeadingDot && '.' !== $car) {
        $regex .= '(?=[^\\.])';
      }
      $firstByte = '/' === $car;
      if ($firstByte && $strictWildcardSlash && isset($glob[$i + 2]) && '**' === $glob[$i + 1] . $glob[$i + 2] && (!isset($glob[$i + 3]) || '/' === $glob[$i + 3])) {
        $car = '[^/]++/';
        if (!isset($glob[$i + 3])) {
          $car .= '?';
        }
        if ($strictLeadingDot) {
          $car = '(?=[^\\.])' . $car;
        }
        $car = '/(?:' . $car . ')*';
        $i += 2 + isset($glob[$i + 3]);
        if ('/' === $delimiter) {
          $car = str_replace('/', '\\/', $car);
        }
      }
      if ($delimiter === $car || '.' === $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 $delimiter . '^' . $regex . '$' . $delimiter;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
Glob::toRegex public static function Returns a regexp which is the equivalent of the glob pattern.