Funkce glob je k dispozici už od PHP 4.3.0, na některých hostinzích je ale z bezpečnostních důvodů zakázaná a neobsahuje ji ani knihovna PHP_Compat (důvodem je pravděpodobně to, že ačkoliv se tato funkce velice jednoduše používá, uvnitř je dosti složitá).
Proto přináším jednodušší náhradu této funkce. Ze znaků masky jsou povolené pouze *
(libovolný počet libovolných znaků) a ?
(libovolný znak), hvězdička navíc zahrnuje i tečku na začátku souboru, zástupné znaky nejsou povolené v názvech adresářů a chování funkce nelze ovlivnit pomocí druhého parametru, pro základní použití by ale tato funkce stačit mohla.
<?php /** Jednodušší náhrada funkce glob() * @param string vyhledávací maska může v názvu souboru obsahovat znak * a ? * @return array pole obsahující všecny nalezené soubory/adresáře * @copyright Jakub Vrána, https://php.vrana.cz/ */ function simple_glob($mask) { $dirname = preg_replace('~[^/]*$~', '', $mask); $dir = opendir(strlen($dirname) ? $dirname : "."); $return = array(); if ($dir) { $pattern = '~^' . strtr(preg_quote($mask, '~'), array('\\*' => '.*', '\\?' => '.')) . '$~'; while (($filename = readdir($dir)) !== false) { if ($filename != "." && $filename != ".." && preg_match($pattern, "$dirname$filename")) { $return[] = "$dirname$filename"; } } closedir($dir); sort($return); } return $return; } ?>
V masce se nahradí všechny znaky se speciálním významem v regulárních výrazech a na odpovídající vzor se převede pouze hvězdička a otazník. Takto upravená maska se potom použije pro porovnání se souborem.
Dodatečně jsem zjistil, že kompletní náhrada funkce glob se do PHP_Compat dostala, ale k dispozici je zatím jen v CVS a navíc špatně funguje rozpoznávání jednotlivých částí cesty. Mimo Windows lze pro porovnání použít funkci fnmatch.
Diskuse je zrušena z důvodu spamu.