我想有一个从Unicode字符串创建插件的函数,例如gen_slug('Andrés Cortez')
应该返回andres-cortez
。我该怎么做呢?
发布于 2010-06-02 15:57:06
而不是冗长的替换,试试这个:
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教程中的内容。
发布于 2015-12-13 04:18:13
更新
由于这个答案引起了一些关注,我添加了一些解释。
所提供的解决方案基本上会将除A-Z、a-z、0-9和-(连字符)之外的所有内容替换为-(连字符)。因此,它不能与其他unicode字符( URL段/字符串的有效字符)一起正常工作。一种常见的情况是输入字符串包含非英语字符。
只有在您确信输入字符串不会包含unicode字符的情况下才使用此解决方案,您可能希望这些字符成为输出/slug的一部分。
例如:“नारीशक्ति”将变为“-”(全连字符),而不是"नारी-शक्ति“(有效的URL slug)。
原始答案
不如..。
$slug = strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string)));
发布于 2012-11-11 22:19:52
如果您安装了intl扩展,可以使用Transliterator::transliterate函数轻松创建一个插件。
<?php
$string = 'Namnet på bildtävlingen';
$slug = \Transliterator::createFromRules(
':: Any-Latin;'
. ':: NFD;'
. ':: [:Nonspacing Mark:] Remove;'
. ':: NFC;'
. ':: [:Punctuation:] Remove;'
. ':: Lower();'
. '[:Separator:] > \'-\''
)
->transliterate( $string );
echo $slug; // namnet-pa-bildtavlingen
?>
https://stackoverflow.com/questions/2955251
复制相似问题