Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

Glob.php

Zuletzt modifiziert: 09.10.2024, 12:55 - Dateigröße: 5.47 KiB


 001  <?php
 002  /**
 003   * Zend Framework (http://framework.zend.com/)
 004   *
 005   * @link      http://github.com/zendframework/zf2 for the canonical source repository
 006   * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
 007   * @license   http://framework.zend.com/license/new-bsd New BSD License
 008   */
 009   
 010  namespace Zend\Stdlib;
 011   
 012  /**
 013   * Wrapper for glob with fallback if GLOB_BRACE is not available.
 014   */
 015  abstract class Glob
 016  {
 017      /**#@+
 018       * Glob constants.
 019       */
 020      const GLOB_MARK     = 0x01;
 021      const GLOB_NOSORT   = 0x02;
 022      const GLOB_NOCHECK  = 0x04;
 023      const GLOB_NOESCAPE = 0x08;
 024      const GLOB_BRACE    = 0x10;
 025      const GLOB_ONLYDIR  = 0x20;
 026      const GLOB_ERR      = 0x40;
 027      /**#@-*/
 028   
 029      /**
 030       * Find pathnames matching a pattern.
 031       *
 032       * @see    http://docs.php.net/glob
 033       * @param  string  $pattern
 034       * @param  int $flags
 035       * @param  bool $forceFallback
 036       * @return array
 037       * @throws Exception\RuntimeException
 038       */
 039      public static function glob($pattern, $flags = 0, $forceFallback = false)
 040      {
 041          if (!defined('GLOB_BRACE') || $forceFallback) {
 042              return static::fallbackGlob($pattern, $flags);
 043          }
 044   
 045          return static::systemGlob($pattern, $flags);
 046      }
 047   
 048      /**
 049       * Use the glob function provided by the system.
 050       *
 051       * @param  string  $pattern
 052       * @param  int     $flags
 053       * @return array
 054       * @throws Exception\RuntimeException
 055       */
 056      protected static function systemGlob($pattern, $flags)
 057      {
 058          if ($flags) {
 059              $flagMap = array(
 060                  self::GLOB_MARK     => GLOB_MARK,
 061                  self::GLOB_NOSORT   => GLOB_NOSORT,
 062                  self::GLOB_NOCHECK  => GLOB_NOCHECK,
 063                  self::GLOB_NOESCAPE => GLOB_NOESCAPE,
 064                  self::GLOB_BRACE    => GLOB_BRACE,
 065                  self::GLOB_ONLYDIR  => GLOB_ONLYDIR,
 066                  self::GLOB_ERR      => GLOB_ERR,
 067              );
 068   
 069              $globFlags = 0;
 070   
 071              foreach ($flagMap as $internalFlag => $globFlag) {
 072                  if ($flags & $internalFlag) {
 073                      $globFlags |= $globFlag;
 074                  }
 075              }
 076          } else {
 077              $globFlags = 0;
 078          }
 079   
 080          ErrorHandler::start();
 081          $res = glob($pattern, $globFlags);
 082          $err = ErrorHandler::stop();
 083          if ($res === false) {
 084              throw new Exception\RuntimeException("glob('{$pattern}', {$globFlags}) failed", 0, $err);
 085          }
 086          return $res;
 087      }
 088   
 089      /**
 090       * Expand braces manually, then use the system glob.
 091       *
 092       * @param  string  $pattern
 093       * @param  int     $flags
 094       * @return array
 095       * @throws Exception\RuntimeException
 096       */
 097      protected static function fallbackGlob($pattern, $flags)
 098      {
 099          if (!$flags & self::GLOB_BRACE) {
 100              return static::systemGlob($pattern, $flags);
 101          }
 102   
 103          $flags &= ~self::GLOB_BRACE;
 104          $length = strlen($pattern);
 105          $paths  = array();
 106   
 107          if ($flags & self::GLOB_NOESCAPE) {
 108              $begin = strpos($pattern, '{');
 109          } else {
 110              $begin = 0;
 111   
 112              while (true) {
 113                  if ($begin === $length) {
 114                      $begin = false;
 115                      break;
 116                  } elseif ($pattern[$begin] === '\\' && ($begin + 1) < $length) {
 117                      $begin++;
 118                  } elseif ($pattern[$begin] === '{') {
 119                      break;
 120                  }
 121   
 122                  $begin++;
 123              }
 124          }
 125   
 126          if ($begin === false) {
 127              return static::systemGlob($pattern, $flags);
 128          }
 129   
 130          $next = static::nextBraceSub($pattern, $begin + 1, $flags);
 131   
 132          if ($next === null) {
 133              return static::systemGlob($pattern, $flags);
 134          }
 135   
 136          $rest = $next;
 137   
 138          while ($pattern[$rest] !== '}') {
 139              $rest = static::nextBraceSub($pattern, $rest + 1, $flags);
 140   
 141              if ($rest === null) {
 142                  return static::systemGlob($pattern, $flags);
 143              }
 144          }
 145   
 146          $p = $begin + 1;
 147   
 148          while (true) {
 149              $subPattern = substr($pattern, 0, $begin)
 150                          . substr($pattern, $p, $next - $p)
 151                          . substr($pattern, $rest + 1);
 152   
 153              $result = static::fallbackGlob($subPattern, $flags | self::GLOB_BRACE);
 154   
 155              if ($result) {
 156                  $paths = array_merge($paths, $result);
 157              }
 158   
 159              if ($pattern[$next] === '}') {
 160                  break;
 161              }
 162   
 163              $p    = $next + 1;
 164              $next = static::nextBraceSub($pattern, $p, $flags);
 165          }
 166   
 167          return array_unique($paths);
 168      }
 169   
 170      /**
 171       * Find the end of the sub-pattern in a brace expression.
 172       *
 173       * @param  string  $pattern
 174       * @param  int $begin
 175       * @param  int $flags
 176       * @return int|null
 177       */
 178      protected static function nextBraceSub($pattern, $begin, $flags)
 179      {
 180          $length  = strlen($pattern);
 181          $depth   = 0;
 182          $current = $begin;
 183   
 184          while ($current < $length) {
 185              if (!$flags & self::GLOB_NOESCAPE && $pattern[$current] === '\\') {
 186                  if (++$current === $length) {
 187                      break;
 188                  }
 189   
 190                  $current++;
 191              } else {
 192                  if (($pattern[$current] === '}' && $depth-- === 0) || ($pattern[$current] === ',' && $depth === 0)) {
 193                      break;
 194                  } elseif ($pattern[$current++] === '{') {
 195                      $depth++;
 196                  }
 197              }
 198          }
 199   
 200          return ($current < $length ? $current : null);
 201      }
 202  }
 203