Converte uma string em um slug.
Desenvolvido por Florian Eckerstorfer em Viena, Europa, com a ajuda de muitos colaboradores excelentes.
ae
substitui ä
).Você pode instalar o Slugify através do Composer:
composer require cocur/slugify
Slugify requer a extensão Multibyte String do PHP. Normalmente você pode usar a opção de configuração --enable-mbstring
ao compilar o PHP. Mais informações podem ser encontradas na documentação do PHP.
Outras etapas podem ser necessárias para integrações.
Gere um slug:
use Cocur Slugify Slugify ;
$ slugify = new Slugify ();
echo $ slugify -> slugify ( " Hello World! " ); // hello-world
Você também pode alterar o separador usado pelo Slugify
:
echo $ slugify -> slugify ( " Hello World! " , " _ " ); // hello_world
A biblioteca também contém CocurSlugifySlugifyInterface
. Use esta interface sempre que precisar digitar dica de uma instância do Slugify
.
Para adicionar regras de transliteração adicionais você pode usar o método addRule()
.
$ slugify -> addRule ( " i " , " ey " );
echo $ slugify -> slugify ( " Hi " ); // hey
Muitas das regras de transliteração usadas no Slugify são específicas de um idioma. Essas regras são, portanto, categorizadas usando conjuntos de regras. As regras para os mais populares são ativadas por padrão em uma ordem específica. Você pode alterar quais conjuntos de regras são ativados e a ordem em que são ativados. A ordem é importante quando existem regras conflitantes em idiomas diferentes. Por exemplo, em alemão ä
é transliterado com ae
, em turco a transliteração correta é a
. Por padrão, a transliteração alemã é usada, já que o alemão é usado com mais frequência na Internet. Se você quiser usar a transliteração turca, você tem várias possibilidades. Você pode ativá-lo após criar o construtor:
$ slugify = new Slugify ();
$ slugify -> slugify ( " ä " ); // -> "ae"
$ slugify -> activateRuleSet ( " turkish " );
$ slugify -> slugify ( " ä " ); // -> "a"
Uma forma alternativa seria passar os conjuntos de regras e sua ordem ao construtor.
$ slugify = new Slugify ([ " rulesets " => [ " default " , " turkish " ]]);
$ slugify -> slugify ( " ä " ); // -> "a"
Você pode encontrar uma lista dos conjuntos de regras disponíveis em Recursos/regras.
O construtor usa um array de opções, você já viu as opções rulesets
acima. Você também pode alterar a expressão regular usada para substituir caracteres pelo separador.
$ slugify = new Slugify ([ " regexp " => " /([^A-Za-z0-9]|-)+/ " ]);
(A expressão regular usada no exemplo acima é a padrão.)
Por padrão, o Slugify converterá o slug para letras minúsculas. Se quiser preservar a caixa da string, você pode definir a opção lowercase
como falsa.
$ slugify = new Slugify ([ " lowercase " => false ]);
$ slugify -> slugify ( " Hello World " ); // -> "Hello-World"
As letras minúsculas são feitas antes de usar a expressão regular. Se você deseja manter o comportamento de letras minúsculas, mas sua expressão regular precisa corresponder a letras maiúsculas, você pode definir a opção lowercase_after_regexp
como true
.
$ slugify = new Slugify ([
" regexp " => " /(?<=[[:^upper:]])(?=[[:upper:]])/ " ,
" lowercase_after_regexp " => false ,
]);
$ slugify -> slugify ( " FooBar " ); // -> "foo-bar"
Por padrão, o Slugify usará travessões como separadores. Se quiser usar um separador padrão diferente, você pode definir a opção separator
.
$ slugify = new Slugify ([ " separator " => " _ " ]);
$ slugify -> slugify ( " Hello World " ); // -> "hello_world"
Por padrão, o Slugify removerá os separadores iniciais e finais antes de retornar o slug. Se você não deseja que o slug seja cortado, você pode definir a opção trim
como falsa.
$ slugify = new Slugify ([ " trim " => false ]);
$ slugify -> slugify ( " Hello World " ); // -> "hello-world-"
Você pode sobrescrever qualquer uma das opções acima imediatamente, passando um array de opções como segundo argumento para o método slugify()
. Por exemplo:
$ slugify = new Slugify ();
$ slugify -> slugify ( " Hello World " , [ " lowercase " => false ]); // -> "Hello-World"
Você também pode modificar o separador desta forma:
$ slugify = new Slugify ();
$ slugify -> slugify ( " Hello World " , [ " separator " => " _ " ]); // -> "hello_world"
Você pode até ativar um conjunto de regras personalizado sem alterar as regras padrão:
$ slugify = new Slugify ();
$ slugify -> slugify ( " für " , [ " ruleset " => " turkish " ]); // -> "fur"
$ slugify -> slugify ( " für " ); // -> "fuer"
Agradecemos muito se você relatar bugs e erros na transliteração, especialmente se você for um falante nativo do idioma e da pergunta. Sinta-se à vontade para solicitar idiomas adicionais nas edições, mas observe que o mantenedor deste repositório não fala todos os idiomas. Se você puder fornecer uma solicitação pull com regras para um novo idioma ou estender as regras para um idioma existente, isso seria incrível.
Para adicionar um novo idioma, você precisa:
[language].json
em Resources/rules
CocurSlugifySlugify::$options
. Se você adicionar o idioma, todos os testes existentes ainda terão que passarphp bin/generate-default.php
tests/SlugifyTest.php
. Se a linguagem estiver no conjunto de regras padrão, adicione seus casos de teste a defaultRuleProvider()
, caso contrário, a customRulesProvider()
.Envie relações públicas. Muito obrigado.
No interesse de promover um ambiente aberto e acolhedor, nós, como colaboradores e mantenedores, comprometemo-nos a tornar a participação no nosso projeto e na nossa comunidade uma experiência livre de assédio para todos, independentemente da idade, tamanho corporal, deficiência, etnia, identidade e expressão de género, nível de experiência, nacionalidade, aparência pessoal, raça, religião ou identidade e orientação sexual.
O Código de Conduta completo pode ser encontrado aqui.
Este projeto não é lugar para ódio. Se você tiver qualquer problema, entre em contato com Florian: [email protected]
Slugify contém um pacote Symfony e uma definição de serviço que permite usá-lo como um serviço em seu aplicativo Symfony. O código reside em CocurSlugifyBridgeSymfonyCocurSlugifyBundle
e você só precisa ativá-lo:
O suporte para Symfony 2 foi eliminado no Slugify 4.0.0, use 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 ],
];
Agora você pode usar o serviço cocur_slugify
em qualquer lugar da sua aplicação, por exemplo, no seu controlador:
$ slug = $ this -> get ( " cocur_slugify " )-> slugify ( " Hello World! " );
O pacote também fornece um alias slugify
para o serviço cocur_slugify
:
$ slug = $ this -> get ( " slugify " )-> slugify ( " Hello World! " );
Se você usa autowire
(Symfony >=3.3), você pode injetá-lo em seus serviços assim:
public function __construct( Cocur Slugify SlugifyInterface $ slugify )
Você pode definir as seguintes configurações em config.yml
(Symfony 2-3) ou config/packages/cocur_slugify.yaml
(Symfony 4) para ajustar o serviço 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
Se você usa a estrutura Symfony com Twig, você pode usar o filtro Twig slugify
em seus modelos depois de configurar as integrações do Symfony (veja acima).
{{ ' Hällo Wörld ' | slugify }}
Se você usa o Twig fora do framework Symfony, primeiro você precisa adicionar a extensão ao seu ambiente:
use Cocur Slugify Bridge Twig SlugifyExtension ;
use Cocur Slugify Slugify ;
$ twig = new Twig_Environment ( $ loader );
$ twig -> addExtension ( new SlugifyExtension (Slugify:: create ()));
Para usar o filtro Twig com TwigBridge para Laravel, você precisará adicionar a extensão Slugify usando um encerramento:
// laravel/app/config/packages/rcrowe/twigbridge/config.php
' extensions ' => array (
//...
function () {
return new Cocur Slugify Bridge Twig SlugifyExtension ( Cocur Slugify Slugify:: create ());
},
),
Você pode encontrar mais informações sobre como registrar extensões na documentação do Twig.
Não precisamos de uma integração adicional para usar o Slugify no Mustache.php. Se você quiser usar o Slugify no Moustache, basta adicionar um auxiliar:
use Cocur Slugify Slugify ;
$ mustache = new Mustache_Engine ([
// ...
" helpers " => [
" slugify " => function ( $ string , $ separator = null ) {
return Slugify:: create ()-> slugify ( $ string , $ separator );
},
],
]);
Slugify também fornece um provedor de serviços para integração ao Laravel (versões 4.1 e posteriores).
No arquivo app/config/app.php
do seu projeto Laravel, adicione o provedor de serviços ao array "providers":
' providers ' => array (
" CocurSlugifyBridgeLaravelSlugifyServiceProvider " ,
)
E adicione a fachada ao array "alias":
' aliases ' => array (
" Slugify " => " CocurSlugifyBridgeLaravelSlugifyFacade " ,
)
Você pode então usar o método Slugify::slugify()
em seus controladores:
$ url = Slugify:: slugify ( " welcome to the homepage " );
Slugify pode ser facilmente usado em aplicativos Zend Framework 2. A ponte incluída fornece um serviço e um auxiliar de visualização já registrado para você.
Basta habilitar o módulo em sua configuração assim.
return [
//...
" modules " => [
" Application " ,
" ZfcBase " ,
" CocurSlugifyBridgeZF2 " , // <- Add this line
//...
],
//...
];
Depois disso, você pode recuperar o serviço CocurSlugifySlugify
(ou o alias slugify
) e gerar um slug.
/** @var ZendServiceManagerServiceManager $sm */
$ slugify = $ sm -> get ( " CocurSlugifySlugify " );
$ slug = $ slugify -> slugify ( " Hällo Wörld " );
$ anotherSlug = $ slugify -> slugify ( " Hällo Wörld " , " _ " );
Nos seus modelos de visualização, use o auxiliar slugify
para gerar slugs.
echo $ this -> slugify ( " Hällo Wörld " ); ?>
echo $ this -> slugify ( " Hällo Wörld " , " _ " ); ?>
O serviço (que também é usado no view helper) pode ser customizado definindo esta chave de configuração.
return [
" cocur_slugify " => [
" reg_exp " => " /([^a-zA-Z0-9]|-)+/ " ,
],
];
Slugify contém uma extensão Nette que permite usá-lo como um serviço em seu aplicativo Nette. Você só precisa registrá-lo em seu config.neon
:
# app/config/config.neon
extensions :
slugify : CocurSlugifyBridgeNetteSlugifyExtension
Agora você pode usar o serviço CocurSlugifySlugifyInterface
em qualquer lugar do seu aplicativo, por exemplo, no seu apresentador:
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 " );
}
}
Se você usar o Nette Framework com seu mecanismo de modelagem Latte nativo, poderá usar o filtro Latte slugify
em seus modelos depois de configurar a extensão Nette (veja acima).
{ $ hello |slugify }
Se você usa o Latte fora do Nette Framework, primeiro você precisa adicionar o filtro ao seu mecanismo:
use Cocur Slugify Bridge Latte SlugifyHelper ;
use Cocur Slugify Slugify ;
use Latte ;
$ latte = new Latte Engine ();
$ latte -> addFilter ( " slugify " , [ new SlugifyHelper (Slugify:: create ()), " slugify " ]);
O Slugify não necessita de uma bridge específica para funcionar com o Slim 3, basta adicionar a seguinte configuração:
$ 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 ;
};
Em um modelo você pode usá-lo assim:
< a href = " /blog/{{ post . title | slugify }} " >{{ post . title | raw }} a > h5 >
Slugify fornece um provedor de serviços para uso com 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);
Você pode configurá-lo compartilhando as opções necessárias:
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);
Você pode configurar qual provedor de regras usar compartilhando-o:
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);
Suporte para Symfony 6.
A versão 4 não introduz novos recursos importantes, mas adiciona suporte para Symfony 4 e 5, Twig 3 e, mais importante, PHP 7.3 e 7.4.
O suporte para PHP 5, Twig 1 e Silex foi eliminado.
composer.json
(por vaguesonwhcr)DefaultRuleProvider
(por gsouf)getName()
ausente CocurSlugifyBridgeTwigSlugifyExtension
(por TomCan)DefaultRuleProvider
em ordem alfabética (por tbmatuka)bindShared
por singleton
na ponte Laravel (por sunspikes)bindShared
por singleton
na ponte Laravel (por sunspikes)Não há novos recursos ou correções de bugs, mas é hora de atualizar o Slugify para a versão 1.0.
protected
(por acelaya)Ď
(por michalskop)Slugify
Esta versão introduz integrações opcionais em Symfony2, Silex e Twig. Você ainda pode usar a biblioteca em qualquer outra estrutura. Decidi incluir essas pontes porque existem integrações de outros desenvolvedores, mas elas usam versões desatualizadas do cocur/slugify. Incluir essas pequenas classes de ponte na biblioteca torna sua manutenção muito mais fácil para mim.
$separator
ausente ao SlugifyInterface
Código quase completamente reescrito, remove o suporte iconv
porque a biblioteca subjacente está quebrada. O código agora está melhor e mais rápido. Muito obrigado a Marchenko Alexandr.
O suporte para chinês foi adaptado de jifei/Pinyin com permissão.
Slugify é um projeto da Cocur. Você pode nos contatar no Twitter: @cocurco
Se precisar de suporte, você pode perguntar no Twitter (bem, apenas se sua pergunta for curta) ou pode entrar em nosso chat no Gitter.
Caso queira apoiar o desenvolvimento do Slugify você pode nos ajudar fornecendo transliterações adicionais ou nos informar se uma transliteração estiver errada. Agradeceríamos muito se você pudesse nos enviar diretamente uma solicitação pull no Github. Se você nunca contribuiu para um projeto no Github, ficaremos felizes em ajudá-lo. Basta perguntar no Twitter ou entrar diretamente no nosso Gitter.
Você sempre pode me ajudar (Florian, o desenvolvedor e mantenedor original) enviando-me um ou dois euros.
A Licença MIT (MIT)
Direitos autorais (c) 2012-2017 Florian Eckerstorfer
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para negociar o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar , publicar, distribuir, sublicenciar e/ou vender cópias do Software e permitir que as pessoas a quem o Software seja fornecido o façam, sujeito às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão serão incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM HIPÓTESE ALGUMA OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.