我试图想出一个功能,它可以很好地清理某些字符串,以便它们可以安全地在URL中使用(如post slug),也可以安全地用作文件名.例如,当有人上传文件时,我想确保从名称中删除所有危险字符.
到目前为止,我已经提出了以下函数,我希望能解决这个问题并允许外部UTF-8数据.
/**
* Convert a string to the file/URL safe "slug" form
*
* @param string $string the string to clean
* @param bool $is_filename TRUE will allow additional filename characters
* @return string
*/
function sanitize($string = '', $is_filename = FALSE)
{
// Replace all weird characters with dashes
$string = preg_replace('/[^\w\-'. ($is_filename ? '~_\.' : ''). ']+/u', '-', $string);
// Only allow one dash separator at a time (and make string lowercase)
return mb_strtolower(preg_replace('/--+/u', '-', $string), …Run Code Online (Sandbox Code Playgroud) 我想清理URL中的字符串,这是我基本上需要的.
例如.
This, is the URL!
Run Code Online (Sandbox Code Playgroud)
必须回来
this-is-the-url
Run Code Online (Sandbox Code Playgroud) 根据bin2hex我的PHP在内部使用UTF-8:
echo bin2hex("ö"); -> c3b6 (utf-8)
echo bin2hex(utf8_decode("ö")); -> f6 (ISO-8859)
Run Code Online (Sandbox Code Playgroud)
但mb_internal_encoding()和iconv_get_encoding()都表示它是ISO-8859-1.
echo mb_internal_encoding(); -> ISO-8859-1
var_dump(iconv_get_encoding()); -> ["input_encoding"]=> string(10) "ISO-8859-1" ["output_encoding"]=> string(10) "ISO-8859-1" ["internal_encoding"]=> string(10) "ISO-8859-1"
Run Code Online (Sandbox Code Playgroud)
UTF-8似乎显然是它正在使用的那个,但为什么它仍然显示ISO-8859-1?