Goodmorning编码小伙伴,
我正在用特殊字符(&,*等)写一个小的正则表达式太干净的文件名
这就是我的代码的样子:
public function clean($string, $bool = false)
{
$string = html_entity_decode($string, ENT_QUOTES);
$string = str_replace("'", "", $string);
$string = str_replace('"', "", $string);
$string = str_replace("&", "en", $string);
$string = str_replace("-", "_", $string);
//ALLE VAGE TEKENS VERVANGEN MET _
$weirdChars = Proces::normalInput($string , true);
if(count($weirdChars[0]) > 0)
{
foreach($weirdChars[0] as $char)
{
$string = str_replace($char, "_", $string);
}
}
if($bool)
$string = ucfirst(preg_replace('!_+!', '_', strtolower($string)));
else
$string = preg_replace('!_+!', '_', strtolower($string));
if(isset($string[0]) && $string[0] == "_")
$string = substr($string, 1);
if(substr($string, -1) == "_")
return substr($string,0,-1);
return $string;
}
public function normalInput($string, $bool = false) //STRING
{
$patern = '/[^_a-zA-Z0-9-]/';
if(preg_match_all($patern, $string, $matches))
{
if($bool)
return $matches;
else
return false;
}
else
{
if($bool)
return $matches;
else
return true;
}
}
这两种方法一起工作并且工作正常,但我注意到了一个小问题。 我在normalInput方法中使用的模式如下:
$patern = '/[^_a-zA-Z0-9-]/';
这很好,但我想排除文件名中的点(否则我的文件扩展名会像blaatfoo_pdf而不是blaatfoo.pdf)。
你能帮我解决这个问题吗?
亲切的问候,
答案 0 :(得分:3)
Goedemorgen。 ; - )
您可以使用白名单或黑名单:
// Whitelist alphanumeric, underscore, dash and dot
$str = preg_replace("/[^a-z0-9-_\.]/", "_", strtolower($str));
// Blacklist
$str = preg_replace("/[<>'\"\\\/\?\: (... and more) ]/", "_", strtolower($str));
这就是它的全部,所以你不需要两个计算50行的函数。我更喜欢白名单方法,因为你永远不会知道你将收到哪些字符作为输入,并且你的文件名中还有一些你不想要的字符。
我还建议调查你的变量和函数命名,因为$bool
并不是真正描述性的。如果需要,请将其称为$ucFirst
。
答案 1 :(得分:0)
您也可以尝试这样做:
$file_parts = pathinfo($string);
$bad_chars = array_merge(array_map('chr', range(0,31)),array("<", ">", ":", '"', "/", "\\", "|", "?", "*", "."));
$filename = str_replace($bad_chars, "_", $file_parts['filename']);
$string = $filename . "." . $file_parts['extension'];