将字符串转换为 slug。
由欧洲维也纳的 Florian Eckerstorfer 在许多伟大贡献者的帮助下开发。
ae
替换ä
)。您可以通过 Composer 安装 Slugify:
composer require cocur/slugify
Slugify 需要 PHP 的多字节字符串扩展。通常,您可以在编译 PHP 时使用配置选项--enable-mbstring
。更多信息可以在 PHP 文档中找到。
集成可能需要进一步的步骤。
生成一个 slug:
use Cocur Slugify Slugify ;
$ slugify = new Slugify ();
echo $ slugify -> slugify ( " Hello World! " ); // hello-world
您还可以更改Slugify
使用的分隔符:
echo $ slugify -> slugify ( " Hello World! " , " _ " ); // hello_world
该库还包含CocurSlugifySlugifyInterface
。每当您需要键入提示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"
您可以在资源/规则中找到可用规则集的列表。
构造函数采用一个选项数组,您已经在上面看到了rulesets
选项。您还可以更改用于用分隔符替换字符的正则表达式。
$ slugify = new Slugify ([ " regexp " => " /([^A-Za-z0-9]|-)+/ " ]);
(上例中使用的正则表达式是默认的。)
默认情况下,Slugify 会将 slug 转换为小写。如果要保留字符串的大小写,可以将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 将在返回 slug 之前删除前导和尾随分隔符。如果您不想修剪 slug,可以将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"
如果您报告音译中的错误和错误,特别是如果您是该语言和问题的母语,我们将不胜感激。请随意在问题中询问其他语言,但请注意,此存储库的维护者并不支持所有语言。如果您可以提供包含新语言规则的拉取请求或扩展现有语言的规则,那就太棒了。
要添加新语言,您需要:
Resources/rules
中创建[language].json
CocurSlugifySlugify::$options
。如果您添加语言,所有现有测试仍然必须通过php bin/generate-default.php
tests/SlugifyTest.php
中添加语言测试。如果语言位于默认规则集中,则将测试用例添加到defaultRuleProvider()
,否则添加到customRulesProvider()
。提交公关。非常感谢。
为了营造一个开放和热情的环境,我们作为贡献者和维护者承诺让每个人参与我们的项目和社区成为无骚扰的体验,无论年龄、体型、残疾、种族、性别认同和表达,经验水平、国籍、个人外表、种族、宗教或性认同和取向。
完整的行为准则可在此处找到。
这个项目不适合仇恨。如果您有任何问题,请联系 Florian:[email protected]
Slugify 包含 Symfony 捆绑包和服务定义,允许您将其用作 Symfony 应用程序中的服务。代码位于CocurSlugifyBridgeSymfonyCocurSlugifyBundle
中,您只需激活它:
Slugify 4.0.0 中已删除对 Symfony 2 的支持,请使用cocur/slugify@3
。
// app/AppKernel.php
class AppKernel extends Kernel
{
public function registerBundles ()
{
$ bundles = [
// ...
new Cocur Slugify Bridge Symfony CocurSlugifyBundle (),
];
}
}
// config/bundles.php
return [
// ...
Cocur Slugify Bridge Symfony CocurSlugifyBundle::class => [ " all " => true ],
];
您现在可以在应用程序中的任何位置使用cocur_slugify
服务,例如在控制器中:
$ slug = $ this -> get ( " cocur_slugify " )-> slugify ( " Hello World! " );
该捆绑包还为cocur_slugify
服务提供了别名slugify
:
$ slug = $ this -> get ( " slugify " )-> slugify ( " Hello World! " );
如果您使用autowire
(Symfony >=3.3),您可以将其注入到您的服务中,如下所示:
public function __construct( Cocur Slugify SlugifyInterface $ slugify )
您可以在config.yml
(Symfony 2-3) 或config/packages/cocur_slugify.yaml
(Symfony 4) 中设置以下配置设置来调整 slugify 服务:
cocur_slugify :
lowercase : false # or true
separator : " - " # any string
# regexp:
rulesets : ["austrian"] # List of rulesets: https://github.com/cocur/slugify/tree/master/Resources/rules
如果您将 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 ()));
要将 Twig 过滤器与 TwigBridge for Laravel 一起使用,您需要使用闭包添加 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 中使用 Slugify。如果你想在 Mustache 中使用 Slugify,只需添加一个助手:
use Cocur Slugify Slugify ;
$ mustache = new Mustache_Engine ([
// ...
" helpers " => [
" slugify " => function ( $ string , $ separator = null ) {
return Slugify:: create ()-> slugify ( $ string , $ separator );
},
],
]);
Slugify 还提供了一个服务提供者来集成到 Laravel(4.1 及更高版本)中。
在 Laravel 项目的app/config/app.php
文件中,将服务提供者添加到“providers”数组中:
' providers ' => array (
" CocurSlugifyBridgeLaravelSlugifyServiceProvider " ,
)
并将外观添加到“aliases”数组中:
' aliases ' => array (
" Slugify " => " CocurSlugifyBridgeLaravelSlugifyFacade " ,
)
然后,您可以在控制器中使用Slugify::slugify()
方法:
$ url = Slugify:: slugify ( " welcome to the homepage " );
Slugify 可以轻松地在 Zend Framework 2 应用程序中使用。包含的桥提供已为您注册的服务和视图助手。
只需像这样在您的配置中启用该模块即可。
return [
//...
" modules " => [
" Application " ,
" ZfcBase " ,
" CocurSlugifyBridgeZF2 " , // <- Add this line
//...
],
//...
];
之后,您可以检索CocurSlugifySlugify
服务(或slugify
别名)并生成 slug。
/** @var ZendServiceManagerServiceManager $sm */
$ slugify = $ sm -> get ( " CocurSlugifySlugify " );
$ slug = $ slugify -> slugify ( " Hällo Wörld " );
$ anotherSlug = $ slugify -> slugify ( " Hällo Wörld " , " _ " );
在您的视图模板中,使用slugify
助手来生成 slugs。
echo $ this -> slugify ( " Hällo Wörld " ); ?>
echo $ this -> slugify ( " Hällo Wörld " , " _ " ); ?>
可以通过定义此配置键来自定义该服务(也在视图助手中使用)。
return [
" cocur_slugify " => [
" reg_exp " => " /([^a-zA-Z0-9]|-)+/ " ,
],
];
Slugify 包含一个 Nette 扩展,允许您将其用作 Nette 应用程序中的服务。您只需在config.neon
中注册它:
# app/config/config.neon
extensions :
slugify : CocurSlugifyBridgeNetteSlugifyExtension
您现在可以在应用程序中的任何位置使用CocurSlugifySlugifyInterface
服务,例如在演示器中:
class MyPresenter extends Nette Application UI Presenter
{
/** @var CocurSlugifySlugifyInterface @inject */
public $ slugify ;
public function renderDefault ()
{
$ this -> template -> hello = $ this -> slugify -> slugify ( " Hällo Wörld " );
}
}
如果您使用 Nette Framework 及其本机 Latte 模板引擎,则可以在设置 Nette 扩展后在模板中使用 Latte 过滤器slugify
(参见上文)。
{ $ hello |slugify }
如果您在 Nette Framework 之外使用 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 " ]);
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 >
Slugify 提供了一个与league/container
一起使用的服务提供商:
use Cocur Slugify ;
use League Container ;
/* @var ContainerContainerInterface $container */
$ container -> addServiceProvider (
new Slugify Bridge League SlugifyServiceProvider ()
);
/* @var SlugifySlugify $slugify */
$ slugify = $ container -> get ( Slugify SlugifyInterface::class);
您可以通过共享所需的选项来配置它:
use Cocur Slugify ;
use League Container ;
/* @var ContainerContainerInterface $container */
$ container -> share ( " config.slugify.options " , [
" lowercase " => false ,
" rulesets " => [ " default " , " german " ],
]);
$ container -> addServiceProvider (
new Slugify Bridge League SlugifyServiceProvider ()
);
/* @var SlugifySlugify $slugify */
$ slugify = $ container -> get ( Slugify SlugifyInterface::class);
您可以通过共享来配置要使用的规则提供程序:
use Cocur Slugify ;
use League Container ;
/* @var ContainerContainerInterface $container */
$ container ->share( Slugify RuleProvider RuleProviderInterface::class, function () {
return new Slugify RuleProvider FileRuleProvider ( __DIR__ . ' /../../rules ' );
]);
$ container -> addServiceProvider ( new Slugify Bridge League SlugifyServiceProvider ());
/* @var SlugifySlugify $slugify */
$ slugify = $ container -> get ( Slugify SlugifyInterface::class);
支持 Symfony 6。
版本 4 没有引入新的主要功能,但增加了对 Symfony 4 和 5、Twig 3 以及最重要的 PHP 7.3 和 7.4 的支持。
不再支持 PHP 5、Twig 1 和 Silex。
composer.json
中需要多字节扩展(作者:wandersonwhcr)DefaultRuleProvider
添加了缺失的法语规则(由 gsouf 提供)getName()
添加到CocurSlugifyBridgeTwigSlugifyExtension
(由 TomCan 提供)DefaultRuleProvider
中的规则进行排序(由 tbmatuka 提供)singleton
替换bindShared
(由 sunspikes 提供)singleton
替换bindShared
(由 sunspikes 提供)没有新功能或错误修复,但是时候将 Slugify 升级到 v1.0 了。
protected
(由 acelaya)Ď
的音译(由 michalskop)Slugify
类中的角色组织该版本引入了与 Symfony2、Silex 和 Twig 的可选集成。您仍然可以在任何其他框架中使用该库。我决定包含这些桥,因为存在来自其他开发人员的集成,但他们使用过时的 cocur/slugify 版本。将这些小桥接类包含在库中使我可以更轻松地维护它们。
$separator
参数添加到SlugifyInterface
几乎完全重写了代码,删除了iconv
支持,因为底层库已损坏。现在代码更好更快。非常感谢马尔琴科·亚历山大。
对中文的支持是经许可改编自 jifei/拼音。
Slugify 是 Cocur 的一个项目。您可以在 Twitter 上联系我们: @cocurco
如果您需要支持,您可以在 Twitter 上提问(当然,前提是您的问题很短),或者您可以在 Gitter 上加入我们的聊天。
如果您想支持 Slugify 的开发,您可以帮助我们提供额外的音译,或者在音译错误时通知我们。如果您能直接在 Github 上向我们发送 Pull Request,我们将不胜感激。如果您从未为 Github 上的项目做出过贡献,我们很乐意为您提供帮助。只需在 Twitter 上提问或直接加入我们的 Gitter。
你总是可以通过寄给我一两欧元来帮助我(Florian,最初的开发者和维护者)。
麻省理工学院许可证 (MIT)
版权所有 (c) 2012-2017 弗洛里安·埃克斯托弗
特此免费授予获得本软件和相关文档文件(“软件”)副本的任何人不受限制地使用本软件,包括但不限于使用、复制、修改、合并的权利、发布、分发、再许可和/或销售软件的副本,并允许向其提供软件的人员这样做,但须满足以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有者均不对因本软件或本软件中的使用或其他交易而产生或与之相关的任何索赔、损害或其他责任负责,无论是合同、侵权行为还是其他行为。软件。