cocur/slugify

将字符串转换为缩略语。

维护者

详细信息

github.com/cocur/slugify

源代码

问题

安装次数: 50,001,188

依赖项: 372

建议者: 10

安全性: 0

星星: 2,867

关注者: 43

分支: 251

开放性问题: 29

v4.6.0 2024-09-10 14:09 UTC

README

将字符串转换为缩略语。

Build Status Windows Build status Scrutinizer Quality Score Code Coverage

Latest Release MIT License Total Downloads

Florian Eckerstorfer在奥地利维也纳开发,得到了许多优秀贡献者的帮助。

功能

  • 从字符串中删除所有特殊字符。
  • 提供阿拉伯语、奥地利语、阿塞拜疆语、巴西葡萄牙语、保加利亚语、缅甸语、中文、克罗地亚语、捷克语、世界语、爱沙尼亚语、芬兰语、法语、格鲁吉亚语、德语、希腊语、印地语、匈牙利语、意大利语、拉脱维亚语、立陶宛语、马其顿语、挪威语、波兰语、罗马尼亚语、俄语、塞尔维亚语、西班牙语、瑞典语、土耳其语、乌克兰语、越南语和意第绪语的特殊字符的定制替换。不是删除这些字符,而是使用Slugify进行近似(例如,ae替换ä)。
  • 没有外部依赖。
  • PSR-4兼容。
  • 兼容PHP >= 8。
  • Symfony (3, 4和5)LaravelTwig (2和3)Zend Framework 2Nette FrameworkLattePlum等集成。

安装

您可以通过Composer安装Slugify。

composer require cocur/slugify

Slugify需要PHP的多字节字符串扩展。通常您可以在编译PHP时使用配置选项--enable-mbstring。更多信息可以在PHP文档中找到。

可能还需要进行集成的额外步骤。

使用

生成缩略语

use Cocur\Slugify\Slugify;

$slugify = new Slugify();
echo $slugify->slugify("Hello World!"); // hello-world

您也可以更改Slugify使用的分隔符

echo $slugify->slugify("Hello World!", "_"); // hello_world

库还包含Cocur\Slugify\SlugifyInterface。当您需要为Slugify实例类型提示时,请使用此接口。

要添加额外的转写规则,您可以使用addRule()方法。

$slugify->addRule("i", "ey");
echo $slugify->slugify("Hi"); // hey

规则集

Slugify中使用的许多转写规则是特定于语言的。因此,这些规则被分类使用规则集。默认情况下,按照特定顺序激活最常见的规则集。您可以更改激活的规则集及其激活顺序。当不同语言中有冲突的规则时,顺序很重要。例如,在德语中ä使用ae转写,在土耳其语中正确的转写是a。默认情况下使用德语转写,因为德语在互联网上使用得更频繁。如果您想优先使用土耳其语转写,有两种方法。您可以在创建构造函数后激活它

$slugify = new Slugify();
$slugify->slugify("ä"); // -> "ae"
$slugify->activateRuleSet("turkish");
$slugify->slugify("ä"); // -> "a"

另一种方法是向构造函数传递规则集及其顺序。

$slugify = new Slugify(["rulesets" => ["default", "turkish"]]);
$slugify->slugify("ä"); // -> "a"

您可以在Resources/rules中找到可用的规则集列表。

更多选项

构造函数接收一个选项数组,您已经在上面的代码中看到了rulesets选项。您还可以更改用于替换字符的分隔符的正则表达式。

$slugify = new Slugify(["regexp" => "/([^A-Za-z0-9]|-)+/"]);

(上面示例中使用的是默认的正则表达式。)

默认情况下,Slugify会将别名转换为小写。如果您想保留字符串的大小写,可以将lowercase选项设置为false。

$slugify = new Slugify(["lowercase" => false]);
$slugify->slugify("Hello World"); // -> "Hello-World"

在应用正则表达式之前执行小写化。如果您想保持小写化行为,但您的正则表达式需要匹配大写字母,可以将lowercase_after_regexp选项设置为true

$slugify = new Slugify([
    "regexp" => "/(?<=[[:^upper:]])(?=[[:upper:]])/",
    "lowercase_after_regexp" => false,
]);
$slugify->slugify("FooBar"); // -> "foo-bar"

默认情况下,Slugify将使用破折号作为分隔符。如果您想使用不同的默认分隔符,可以将separator选项进行设置。

$slugify = new Slugify(["separator" => "_"]);
$slugify->slugify("Hello World"); // -> "hello_world"

默认情况下,Slugify将在返回别名之前移除前导和尾随的分隔符。如果您不希望别名被修剪,可以将trim选项设置为false。

$slugify = new Slugify(["trim" => false]);
$slugify->slugify("Hello World "); // -> "hello-world-"

动态更改选项

您可以通过将选项数组作为slugify()方法的第二个参数传递,动态地覆盖上述任何选项。例如

$slugify = new Slugify();
$slugify->slugify("Hello World", ["lowercase" => false]); // -> "Hello-World"

您也可以这样修改分隔符

$slugify = new Slugify();
$slugify->slugify("Hello World", ["separator" => "_"]); // -> "hello_world"

您甚至可以激活一个自定义规则集,而不必触及默认规则

$slugify = new Slugify();
$slugify->slugify("für", ["ruleset" => "turkish"]); // -> "fur"
$slugify->slugify("für"); // -> "fuer"

贡献

如果您在转写中报告错误和错误,我们将非常感激,尤其是如果您是该语言的母语人士并有疑问。请在问题中随意要求更多语言,但请注意,该存储库的维护者不会说所有语言。如果您能提供带有新语言规则的拉取请求或扩展现有语言的规则,那将是惊人的。

要添加新语言,您需要

  1. Resources/rules中创建一个[language].json
  2. 如果您认为该语言应该是默认规则集,可以将该语言添加到Cocur\Slugify\Slugify::$options中。如果您将其添加到那里,所有现有的测试都必须通过
  3. 运行php bin/generate-default.php
  4. tests/SlugifyTest.php中为语言添加测试。如果语言在默认规则集中,请将您的测试用例添加到defaultRuleProvider()中,否则添加到customRulesProvider()中。

提交PR。非常感谢。💚

行为准则

为了促进一个开放和欢迎的环境,我们作为贡献者和维护者承诺,无论年龄、体型、残疾、种族、性别身份和表达、经验水平、国籍、个人外貌、种族、宗教或性身份和取向,为每个人提供一个没有骚扰的项目和社区参与体验。

完整的行为准则可以在这里找到。

这个项目不是仇恨的地方。如果您有任何问题,请联系Florian:[email protected] ✌🏻🏳️‍🌈

更多信息

集成

Symfony

Slugify包含一个Symfony包和服务定义,允许您将其作为服务在您的Symfony应用程序中使用。代码位于Cocur\Slugify\Bridge\Symfony\CocurSlugifyBundle中,您只需要激活它

Symfony 2

在Slugify 4.0.0中已弃用对Symfony 2的支持,请使用cocur/slugify@3

Symfony 3

// app/AppKernel.php

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = [
            // ...
            new Cocur\Slugify\Bridge\Symfony\CocurSlugifyBundle(),
        ];
    }
}

Symfony >= 4

// config/bundles.php

return [
    // ...
    Cocur\Slugify\Bridge\Symfony\CocurSlugifyBundle::class => ["all" => true],
];

您现在可以在应用程序的任何地方使用cocur_slugify服务,例如,在控制器中

$slug = $this->get("cocur_slugify")->slugify("Hello World!");

该包还提供了一个别名slugify,用于cocur_slugify服务

$slug = $this->get("slugify")->slugify("Hello World!");

如果您使用autowire(Symfony >=3.3),您可以像这样将其注入到您的服务中

public function __construct(\Cocur\Slugify\SlugifyInterface $slugify)

Symfony配置

您可以在 config.yml(Symfony 2-3)或 config/packages/cocur_slugify.yaml(Symfony 4)中设置以下配置设置来调整slugify服务

cocur_slugify:
    lowercase: false # or true
    separator: "-" # any string
    # regexp: <string>
    rulesets: ["austrian"] # List of rulesets: https://github.com/cocur/slugify/tree/master/Resources/rules

Twig

如果您使用Symfony框架与Twig,您可以在设置好Symfony集成(见上文)后,在您的模板中使用Twig过滤器 slugify

{{ 'Hällo Wörld'|slugify }}

如果您在Symfony框架之外使用Twig,您首先需要将扩展添加到您的环境中

use Cocur\Slugify\Bridge\Twig\SlugifyExtension;
use Cocur\Slugify\Slugify;

$twig = new Twig_Environment($loader);
$twig->addExtension(new SlugifyExtension(Slugify::create()));

要使用针对Laravel的 TwigBridge 的Twig过滤器,您需要使用闭包添加Slugify扩展

// laravel/app/config/packages/rcrowe/twigbridge/config.php

'extensions' => array(
    //...
    function () {
        return new \Cocur\Slugify\Bridge\Twig\SlugifyExtension(\Cocur\Slugify\Slugify::create());
    },
),

有关注册扩展的更多信息,请参阅 Twig文档

Mustache.php

Mustache.php 中使用Slugify不需要额外的集成。如果您想在Mustache中使用Slugify,只需添加一个助手即可

use Cocur\Slugify\Slugify;

$mustache = new Mustache_Engine([
    // ...
    "helpers" => [
        "slugify" => function ($string, $separator = null) {
            return Slugify::create()->slugify($string, $separator);
        },
    ],
]);

Laravel

Slugify还提供了一个服务提供商,可集成到Laravel(4.1版本及以后)中。

在您的Laravel项目的 app/config/app.php 文件中,将服务提供商添加到“providers”数组中

'providers' => array(
    "Cocur\Slugify\Bridge\Laravel\SlugifyServiceProvider",
)

并将外观添加到“aliases”数组中

'aliases' => array(
    "Slugify" => "Cocur\Slugify\Bridge\Laravel\SlugifyFacade",
)

然后您可以在您的控制器中使用 Slugify::slugify() 方法

$url = Slugify::slugify("welcome to the homepage");

Zend Framework 2

Slugify可以轻松地在Zend Framework 2应用程序中使用。包括的桥接器已经为您注册了服务和视图助手。

只需像这样在您的配置中启用模块。

return [
    //...

    "modules" => [
        "Application",
        "ZfcBase",
        "Cocur\Slugify\Bridge\ZF2", // <- Add this line
        //...
    ],

    //...
];

之后,您可以检索 Cocur\Slugify\Slugify 服务(或 slugify 别名)并生成一个slug。

/** @var \Zend\ServiceManager\ServiceManager $sm */
$slugify = $sm->get("Cocur\Slugify\Slugify");
$slug = $slugify->slugify("Hällo Wörld");
$anotherSlug = $slugify->slugify("Hällo Wörld", "_");

在您的视图模板中,使用 slugify 助手来生成slugs。

<?php echo $this->slugify("Hällo Wörld"); ?>
<?php echo $this->slugify("Hällo Wörld", "_"); ?>

可以通过定义此配置键来自定义(也是视图助手使用的)服务。

return [
    "cocur_slugify" => [
        "reg_exp" => "/([^a-zA-Z0-9]|-)+/",
    ],
];

Nette Framework

Slugify包含一个Nette扩展,允许您将其作为服务在您的Nette应用程序中使用。您只需在您的 config.neon 中注册它

# app/config/config.neon

extensions:
    slugify: Cocur\Slugify\Bridge\Nette\SlugifyExtension

现在您可以在应用程序的任何地方使用 Cocur\Slugify\SlugifyInterface 服务,例如在您的presenter中

class MyPresenter extends \Nette\Application\UI\Presenter
{
    /** @var \Cocur\Slugify\SlugifyInterface @inject */
    public $slugify;

    public function renderDefault()
    {
        $this->template->hello = $this->slugify->slugify("Hällo Wörld");
    }
}

Latte

如果您使用Nette框架及其本地的Latte模板引擎,您可以在设置Nette扩展(见上文)后在您的模板中使用Latte过滤器 slugify

{$hello|slugify}

如果您在Nette框架之外使用Latte,您首先需要将过滤器添加到您的引擎中

use Cocur\Slugify\Bridge\Latte\SlugifyHelper;
use Cocur\Slugify\Slugify;
use Latte;

$latte = new Latte\Engine();
$latte->addFilter("slugify", [new SlugifyHelper(Slugify::create()), "slugify"]);

Slim 3

Slugify不需要特定的桥接器即可与 Slim 3 一起工作,只需添加以下配置

$container["view"] = function ($c) {
    $settings = $c->get("settings");
    $view = new \Slim\Views\Twig(
        $settings["view"]["template_path"],
        $settings["view"]["twig"]
    );
    $view->addExtension(
        new Slim\Views\TwigExtension(
            $c->get("router"),
            $c->get("request")->getUri()
        )
    );
    $view->addExtension(
        new Cocur\Slugify\Bridge\Twig\SlugifyExtension(
            Cocur\Slugify\Slugify::create()
        )
    );
    return $view;
};

在模板中,您可以像这样使用它

<a href="/blog/{{ post.title|slugify }}">{{ post.title|raw }}</a></h5>

League

Slugify为使用 league/container 提供了一个服务提供商

use Cocur\Slugify;
use League\Container;

/* @var Container\ContainerInterface $container */
$container->addServiceProvider(
    new Slugify\Bridge\League\SlugifyServiceProvider()
);

/* @var Slugify\Slugify $slugify */
$slugify = $container->get(Slugify\SlugifyInterface::class);

您可以通过共享所需选项来配置它

use Cocur\Slugify;
use League\Container;

/* @var Container\ContainerInterface $container */
$container->share("config.slugify.options", [
    "lowercase" => false,
    "rulesets" => ["default", "german"],
]);

$container->addServiceProvider(
    new Slugify\Bridge\League\SlugifyServiceProvider()
);

/* @var Slugify\Slugify $slugify */
$slugify = $container->get(Slugify\SlugifyInterface::class);

您可以通过共享来配置要使用的规则提供者

use Cocur\Slugify;
use League\Container;

/* @var Container\ContainerInterface $container */
$container->share(Slugify\RuleProvider\RuleProviderInterface::class, function () {
    return new Slugify\RuleProvider\FileRuleProvider(__DIR__ . '/../../rules');
]);

$container->addServiceProvider(new Slugify\Bridge\League\SlugifyServiceProvider());

/* @var Slugify\Slugify $slugify */
$slugify = $container->get(Slugify\SlugifyInterface::class);

变更日志

版本 4.6.0(2024年9月10日)

  • #336 添加Yiddish语言规则集(由 yankl 提供)
  • #340 修复了针对Symfony 7.1的修复(由 Evgeny1973 提供)
  • #342 修复了PHP 8.4关于隐式null参数的弃用问题(由 shyim 提供)

版本 4.5.1(2023年9月16日)

  • 停止对PHP 7的支持并修复版本约束
  • 替换v4.5.0

版本 4.5(2023年9月16日)

  • #327 将韩语添加到默认规则集
  • 自本版本开始,由于与PHP 7不兼容,已被v4.5.1替代

版本 4.4.1(2023年9月17日)

  • 从兼容性列表中删除PHP 7
  • 替代v4.4.0

版本 4.4(2023年8月5日)

  • #320 添加韩语(由 MrMooky 提供)
  • #322 添加类型以避免PHP 8.2弃用警告(由 antoniovj1 提供)
  • 自本版本开始,由于与PHP 7不兼容,已被v4.4.1替代

版本 4.3(2022年12月7日)

版本 4.2(2022年8月13日)

版本 4.1(2022年1月11日)

支持Symfony 6。

版本 4.0(2019年12月14日)

版本4没有引入新的主要功能,但增加了对Symfony 4和5、Twig 3的支持,最重要的是,增加了对PHP 7.3和7.4的支持。

停止支持PHP 5、Twig 1和Silex。

版本3.2(2019年1月31日)

版本3.1(2018年1月22日)

版本3.0.1(2017年9月24日)

版本 3.0(2017年8月11日)

  • HHVM不再受支持
  • 错误修复 #165 将缺失的法国规则添加到DefaultRuleProvider(由 gsouf 提供)
  • #168 添加波斯语规则(由 mohammad6006 提供)
  • 错误修复 #169 将缺失的getName()添加到Cocur\Slugify\Bridge\Twig\SlugifyExtension(由 TomCan 提供)
  • #172DefaultRuleProvider中对规则进行字母排序(由 tbmatuka 提供)
  • #174 添加匈牙利语规则(由 rviktor87 提供)
  • #180 添加巴西葡萄牙语规则(由 tallesairan 提供)
  • 错误修复 #181 添加缺失的法国规则(由 FabienPapet 提供)

版本 2.5(2017年3月23日)

版本 2.4(2017年2月9日)

  • #133 允许修改选项而不创建新对象(由 leofeyer 提供)
  • #135 添加对丹麦语的支持(由 izehose 提供)
  • #140 更新印地语支持(由 arunlodhi 提供)
  • #146 添加对意大利语的支持(由 gianiaz 提供)
  • #151 添加对塞尔维亚语的支持(由 cvetan 提供)
  • #155 更新立陶宛语支持(由 s4uliu5 提供)

版本 2.3(2016年8月9日)

  • #124 修复对保加利亚语的支持
  • #125 更新 Silex 2 提供者(由 JakeFr 提供)
  • #129 添加克罗地亚语支持(由 napravicukod 提供)

版本 2.2(2016 年 7 月 10 日)

  • #102 添加阿塞拜疆语的转写(由 seferov 提供)
  • #109 将整数值转换为字符串(由 JonathanMH 提供)
  • #114 为 league/container 提供 SlugifyServiceProvider(由 localheinz 提供)
  • #120 添加与 Silex 2 的兼容性(由 shamotj 提供)

版本 2.1.1(2016 年 4 月 8 日)

  • 默认不激活瑞典规则(修复了 v2.1 版本的错误发布)

版本 2.1.0(2016 年 4 月 8 日)

  • #104 添加 Symfony 配置(由 estahn 提供)
  • #107 修复瑞典规则

版本 2.0.0(2016 年 2 月 24 日)

版本 1.4.1(2016 年 2 月 11 日)

  • #90 在 Laravel 中将 bindShared 替换为 singleton(由 sunspikes 提供)

版本 1.4(2015 年 9 月 29 日)

  • #75 删除重复的数组条目(由 irfanevrens 提供)
  • #76 添加对格鲁吉亚语的支持(由 TheGIBSON 提供)
  • #77 修复丹麦语的转写(由 kafoso 提供)

版本 1.3(2015 年 9 月 2 日)

  • #70 添加缺失的上标和下标数字(由 BlueM 提供)
  • #71 改进希腊语支持(由 kostaspt 提供)
  • #72 改进 Silex 集成(由 CarsonF 提供)
  • #73 改进俄语支持(由 akost 提供)

版本 1.2(2015 年 7 月 2 日)

版本 1.1(2015 年 3 月 18 日)

  • #54 添加对缅甸字符的支持(由 lovetostrike 提供)
  • #58 添加 Nette 和 Latte 集成(由 lookyman 提供)
  • #50 修复越南字符 Đ 的转写(由 mac2000 提供)

版本 1.0(2014 年 11 月 26 日)

没有新功能或错误修复,但现在是时候将 Slugify 提升至 v1.0 版本了。

版本 0.11(2014 年 11 月 23 日)

  • #49 添加 Zend Framework 2 集成(由 acelaya 提供)

版本 0.10.3(2014 年 11 月 8 日)

  • #48 添加对越南语的支持(由 mac2000 提供)

版本 0.10.2(2014 年 10 月 18 日)

版本 0.10.1(2014 年 9 月 1 日)

版本 0.10.0(2014 年 8 月 26 日)

版本 0.9(2014 年 5 月 29 日)

  • #28 添加了 Symfony2 服务别名,并将 Twig 扩展设置为私有(由 Kevin Bond 提供)

版本 0.8(2014 年 4 月 18 日)

  • #27 添加了对阿拉伯字符的支持(由 Davide Bellini 提供)
  • 添加了一些缺失的字符
  • 改进了 Slugify 类中字符的组织

版本 0.7(2014 年 4 月 4 日)

本版本引入了到 Symfony2、Silex 和 Twig 的可选集成。您仍然可以在任何其他框架中使用该库。我决定包括这些桥梁,因为存在来自其他开发者的集成,但他们使用的是 cocur/slugify 的过时版本。将这些小型桥梁类包含在库中使维护它们对我来说更容易。

  • #23 添加了 Symfony2 服务
  • #24 添加了 Twig 扩展
  • #25 添加了 Silex 服务提供者

版本 0.6(2014 年 4 月 2 日)

版本 0.5(2014 年 3 月 28 日)

  • #21 添加了对希腊字符的支持(由 Michel Petit 提供)
  • #20 修复了西里尔字母 D 的规则(由 Marchenko Alexandr 提供)
  • SlugifyInterface 添加了缺失的 $separator 参数

版本 0.4.1(2014 年 3 月 9 日)

版本 0.4(2014 年 1 月 17 日)

几乎完全重写了代码,移除了对 iconv 的支持,因为底层库已损坏。现在的代码更好更快。感谢 Marchenko Alexandr

版本 0.3(2014 年 1 月 12 日)

  • #11 PSR-4 兼容(由 mac2000 提供)
  • #13 添加了 editorconfig(由 mac2000 提供)
  • #14 当输入为空时返回空 slug,并删除了未使用的参数(由 mac2000 提供)

作者

中文支持已从 jifei/Pinyin 获得许可并进行了适配。

Slugify 是 Cocur 的一个项目。您可以在 Twitter 上联系我们:@cocurco

支持

如果您需要支持,您可以在 Twitter 上提问(嗯,只有当您的问题很短时)或者您可以在 Gitter 上加入我们的聊天。

Gitter

如果您想支持Slugify的发展,可以通过提供额外的转写或告知我们某个转写是否错误来帮助我们。如果您能直接在GitHub上向我们发送Pull Request,我们将非常感激。如果您从未在GitHub上为项目做出过贡献,我们也愿意提供帮助。只需在Twitter上询问或直接加入我们的Gitter即可。

您总是可以通过给我发一些欧元来帮助我(Florian,原始开发者和维护者)。

许可

MIT许可(MIT)

版权所有(c)2012-2017 Florian Eckerstorfer

特此授予任何人免费获得本软件及其相关文档文件(以下简称“软件”)副本的许可,以不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权力,并允许向软件提供者提供软件的人行使其权利,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何形式的质量保证,无论是明示的、暗示的还是法定的,包括但不限于适销性、特定目的的适用性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论该索赔、损害或其他责任是基于合同、侵权或其他法律行为,以及与软件或其使用或其他交易有关。