用于制作 slug 的 PHP 函数(URL 字符串)
2022-08-30 06:20:14
我想要一个函数来从Unicode字符串创建slug,例如 应该返回 。我应该怎么做?gen_slug('Andrés Cortez')
andres-cortez
我想要一个函数来从Unicode字符串创建slug,例如 应该返回 。我应该怎么做?gen_slug('Andrés Cortez')
andres-cortez
与其冗长的替换,不如试试这个:
public static function slugify($text, string $divider = '-')
{
// replace non letter or digits by divider
$text = preg_replace('~[^\pL\d]+~u', $divider, $text);
// transliterate
$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
// remove unwanted characters
$text = preg_replace('~[^-\w]+~', '', $text);
// trim
$text = trim($text, $divider);
// remove duplicate divider
$text = preg_replace('~-+~', $divider, $text);
// lowercase
$text = strtolower($text);
if (empty($text)) {
return 'n-a';
}
return $text;
}
这是基于Symfony的Jobeet教程中的那个。
由于这个答案引起了一些关注,所以我增加了一些解释。
提供的解决方案基本上将替换除 A-Z、a-z、0-9 和 - (连字符)之外的所有内容。因此,它不能与其他 unicode 字符(这些字符是 URL slug/string 的有效字符)一起正常工作。一种常见情况是输入字符串包含非英语字符。
仅当您确信输入字符串不包含 Unicode 字符时,才使用此解决方案,您可能希望将其作为输出/辅助信息块的一部分。
例如。“नारी शक्ति”将变为“----------”(所有连字符),而不是“नारी-शक्ति”(有效的URL slug)。
$slug = strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string)));