diff --git a/var/Typecho/Common.php b/var/Typecho/Common.php index 4cf54feb..0928d118 100644 --- a/var/Typecho/Common.php +++ b/var/Typecho/Common.php @@ -854,14 +854,38 @@ EOF; * @param integer $maxLength 缩略名最大长度 * @return string */ - public static function slugName($str, $default = NULL, $maxLength = 200) + public static function slugName($str, $default = NULL, $maxLength = 128) { - $str = str_replace(array("'", ":", "\\", "/", '"'), "", $str); - $str = str_replace(array("+", ",", ' ', ',', ' ', ".", "?", "=", "&", "!", "<", ">", "(", ")", "[", "]", "{", "}"), "-", $str); - $str = trim($str, '-'); - $str = empty($str) ? $default : $str; + $str = trim($str); - return function_exists('mb_get_info') ? mb_strimwidth($str, 0, 128, '', self::$charset) : substr($str, 0, $maxLength); + if (!strlen($str)) { + return $default; + } + + if (function_exists('mb_regex_encoding')) { + mb_regex_encoding(self::$charset); + mb_ereg_search_init($str, "[\w" . preg_quote('_-') . "]+"); + $result = mb_ereg_search(); + $return = ''; + + if ($result) { + $regs = mb_ereg_search_getregs(); + $pos = 0; + do { + $return .= ($pos > 0 ? '-' : '') . $regs[0]; + $pos ++; + } while ($regs = mb_ereg_search_regs()); + } + + $str = $return; + } else { + $str = str_replace(array("'", ":", "\\", "/", '"'), "", $str); + $str = str_replace(array("+", ",", ' ', ',', ' ', ".", "?", "=", "&", "!", "<", ">", "(", ")", "[", "]", "{", "}"), "-", $str); + $str = trim($str, '-'); + } + + $str = !strlen($str) ? $default : $str; + return substr($str, 0, $maxLength); } /**