首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >生成slug (URL字符串)的PHP函数

生成slug (URL字符串)的PHP函数
EN

Stack Overflow用户
提问于 2010-06-02 13:41:17
回答 24查看 297.8K关注 0票数 197

我想有一个从Unicode字符串创建插件的函数,例如gen_slug('Andrés Cortez')应该返回andres-cortez。我该怎么做呢?

EN

回答 24

Stack Overflow用户

回答已采纳

发布于 2010-06-02 15:57:06

而不是冗长的替换,试试这个:

代码语言:javascript
复制
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教程中的内容。

票数 517
EN

Stack Overflow用户

发布于 2015-12-13 04:18:13

更新

由于这个答案引起了一些关注,我添加了一些解释。

所提供的解决方案基本上会将除A-Z、a-z、0-9和-(连字符)之外的所有内容替换为-(连字符)。因此,它不能与其他unicode字符( URL段/字符串的有效字符)一起正常工作。一种常见的情况是输入字符串包含非英语字符。

只有在您确信输入字符串不会包含unicode字符的情况下才使用此解决方案,您可能希望这些字符成为输出/slug的一部分。

例如:“नारीशक्ति”将变为“-”(全连字符),而不是"नारी-शक्ति“(有效的URL slug)。

原始答案

不如..。

代码语言:javascript
复制
$slug = strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string)));
票数 57
EN

Stack Overflow用户

发布于 2012-11-11 22:19:52

如果您安装了intl扩展,可以使用Transliterator::transliterate函数轻松创建一个插件。

代码语言:javascript
复制
<?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
?>
票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2955251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档