PHP glob具有不区分大小写的匹配

Goo*_*bot 5 php glob

glob用来寻找文件夹

$str = "Test Folder";
$folder = glob("$dir/*$str*");
Run Code Online (Sandbox Code Playgroud)

如何区分glob要匹配的文件夹,区分大小写?

匹配的测试文件夹TEST FOLDER

注意,这$str是脚本的未知输入!

mic*_*usa 4

我可以建议在 的每个字母上构建不区分大小写的字符范围吗$str

\n\n

代码:(演示

\n\n
function glob_i($string){  // this function is not multi-byte ready.\n    $result=\'\';  // init the output string to allow concatenation\n    for($i=0,$len=strlen($string); $i<$len; ++$i){  // loop each character\n        if(ctype_alpha($string[$i])){  // check if it is a letter\n            $result.=\'[\'.lcfirst($string[$i]).ucfirst($string[$i]).\']\';  // add 2-character pattern\n        }else{\n            $result.=$string[$i];  // add non-letter character\n        }\n    }\n    return $result;  // return the prepared string\n}\n$dir=\'public_html\';\n$str=\'Test Folder\';\n\necho glob_i($str);  // [tT][eE][sS][tT] [fF][oO][lL][dD][eE][rR]\necho "\\n";\necho "$dir/*",glob_i($str),\'*\';  // public_html/*[tT][eE][sS][tT] [fF][oO][lL][dD][eE][rR]*\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您需要多字节版本,这是我建议的片段:(演示

\n\n
function glob_im($string,$encoding=\'utf8\'){\n    $result=\'\';\n    for($i=0,$len=mb_strlen($string); $i<$len; ++$i){\n        $l=mb_strtolower(mb_substr($string,$i,1,$encoding));\n        $u=mb_strtoupper(mb_substr($string,$i,1,$encoding));\n        if($l!=$u){\n            $result.="[{$l}{$u}]";\n        }else{\n            $result.=mb_substr($string,$i,1,$encoding);\n        }\n    }\n    return $result;\n}\n$dir=\'public_html\';\n$str=\'testovac\xc3\xad slo\xc5\xbeku\';\n\necho glob_im($str);  // [tT][eE][sS][tT][oO][vV][aA][cC][\xc3\xad\xc3\x8d] [sS][lL][oO][\xc5\xbe\xc5\xbd][kK][uU]\necho "\\n";\necho "$dir/*",glob_im($str),\'*\';  // public_html/*[tT][eE][sS][tT][oO][vV][aA][cC][\xc3\xad\xc3\x8d] [sS][lL][oO][\xc5\xbe\xc5\xbd][kK][uU]*\n
Run Code Online (Sandbox Code Playgroud)\n\n

相关 Stackoverflow 页面:

\n\n

PHP 的 glob() 可以以不区分大小写的方式查找文件吗?

\n\n
\n\n

ps 如果您不介意正则表达式的费用和/或您更喜欢简洁的单行代码,那么这将起到相同的作用:(演示

\n\n
$dir=\'public_html\';\n$str=\'Test Folder\';\necho "$dir/*",preg_replace_callback(\'/[a-z]/i\',function($m){return \'[\'.lcfirst($m[0]).ucfirst($m[0])."]";},$str),\'*\';  // $public_html/*[tT][eE][sS][tT] [fF][oO][lL][dD][eE][rR]*\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是多字节版本:(演示

\n\n
$encoding=\'utf8\';\n$dir=\'public_html\';\n$str=\'testovac\xc3\xad slo\xc5\xbeku\';\necho "$dir/*",preg_replace_callback(\'/\\pL/iu\',function($m)use($encoding){return \'[\'.mb_strtolower($m[0],$encoding).mb_strtoupper($m[0],$encoding)."]";},$str),\'*\';  // public_html/*[tT][eE][sS][tT][oO][vV][aA][cC][\xc3\xad\xc3\x8d] [sS][lL][oO][\xc5\xbe\xc5\xbd][kK][uU]*\n
Run Code Online (Sandbox Code Playgroud)\n