Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
50.00% |
1 / 2 |
CRAP | |
87.04% |
47 / 54 |
| RegexHelper | |
0.00% |
0 / 1 |
|
50.00% |
1 / 2 |
50.61 | |
87.04% |
47 / 54 |
| isRegex | |
100.00% |
1 / 1 |
6 | |
100.00% |
9 / 9 |
|||
| globToRegex | |
0.00% |
0 / 1 |
46.02 | |
84.44% |
38 / 45 |
|||
| <?php | |
| namespace Gek\FileFinder; | |
| class RegexHelper | |
| { | |
| /** | |
| * stringin Regex olup olmadığını kontrol eder. | |
| * | |
| * @param string $str | |
| * @return bool | |
| */ | |
| public static function isRegex(string $str):bool { | |
| if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) { | |
| $start = substr($m[1], 0, 1); | |
| $end = substr($m[1], -1); | |
| if ($start === $end) { | |
| return !preg_match('/[*?[:alnum:] \\\\]/', $start); | |
| } | |
| foreach ([['{', '}'], ['(', ')'], ['[', ']'], ['<', '>']] as $delimiters) { | |
| if ($start === $delimiters[0] && $end === $delimiters[1]) { | |
| return true; | |
| } | |
| } | |
| } | |
| return false; | |
| } | |
| /** | |
| * Glob patterni regex e çevirir. | |
| * | |
| * @param string $glob | |
| * @param bool $strictLeadingDot | |
| * @param bool $strictWildcardSlash | |
| * @param string $delimiter | |
| * @return string | |
| */ | |
| public static function globToRegex(string $glob, bool $strictLeadingDot = true, bool $strictWildcardSlash = true, string $delimiter = '#'):string { | |
| $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; | |
| } | |
| } |