Convierte una cuerda en una babosa.
Desarrollado por Florian Eckerstorfer en Viena, Europa, con la ayuda de muchos grandes colaboradores.
ae
reemplaza ä
).Puedes instalar Slugify a través de Composer:
composer require cocur/slugify
Slugify requiere la extensión Multibyte String de PHP. Normalmente puedes usar la opción de configuración --enable-mbstring
mientras compilas PHP. Puede encontrar más información en la documentación de PHP.
Es posible que se necesiten más pasos para las integraciones.
Generar una babosa:
use Cocur Slugify Slugify ;
$ slugify = new Slugify ();
echo $ slugify -> slugify ( " Hello World! " ); // hello-world
También puedes cambiar el separador utilizado por Slugify
:
echo $ slugify -> slugify ( " Hello World! " , " _ " ); // hello_world
La biblioteca también contiene CocurSlugifySlugifyInterface
. Utilice esta interfaz siempre que necesite escribir una pista de una instancia de Slugify
.
Para agregar reglas de transliteración adicionales, puede utilizar el método addRule()
.
$ slugify -> addRule ( " i " , " ey " );
echo $ slugify -> slugify ( " Hi " ); // hey
Muchas de las reglas de transliteración utilizadas en Slugify son específicas de un idioma. Por lo tanto, estas reglas se clasifican mediante conjuntos de reglas. Las reglas para los más populares se activan de forma predeterminada en un orden específico. Puede cambiar qué conjuntos de reglas se activan y el orden en que se activan. El orden es importante cuando hay reglas contradictorias en diferentes idiomas. Por ejemplo, en alemán ä
se translitera con ae
, en turco la transliteración correcta es a
. De forma predeterminada se utiliza la transliteración alemana, ya que el alemán se utiliza con más frecuencia en Internet. Si desea utilizar la transliteración turca, tiene varias posibilidades. Puedes activarlo después de crear el constructor:
$ slugify = new Slugify ();
$ slugify -> slugify ( " ä " ); // -> "ae"
$ slugify -> activateRuleSet ( " turkish " );
$ slugify -> slugify ( " ä " ); // -> "a"
Una forma alternativa sería pasar los conjuntos de reglas y su orden al constructor.
$ slugify = new Slugify ([ " rulesets " => [ " default " , " turkish " ]]);
$ slugify -> slugify ( " ä " ); // -> "a"
Puede encontrar una lista de los conjuntos de reglas disponibles en Recursos/reglas.
El constructor toma una matriz de opciones, ya has visto las opciones de rulesets
anteriores. También puede cambiar la expresión regular que se utiliza para reemplazar caracteres con el separador.
$ slugify = new Slugify ([ " regexp " => " /([^A-Za-z0-9]|-)+/ " ]);
(La expresión regular utilizada en el ejemplo anterior es la predeterminada).
De forma predeterminada, Slugify convertirá el slug a minúsculas. Si desea conservar el caso de la cadena, puede establecer la opción lowercase
en falso.
$ slugify = new Slugify ([ " lowercase " => false ]);
$ slugify -> slugify ( " Hello World " ); // -> "Hello-World"
Las minúsculas se realizan antes de utilizar la expresión regular. Si desea mantener el comportamiento de minúsculas pero su expresión regular debe coincidir con las letras mayúsculas, puede configurar la opción lowercase_after_regexp
en true
.
$ slugify = new Slugify ([
" regexp " => " /(?<=[[:^upper:]])(?=[[:upper:]])/ " ,
" lowercase_after_regexp " => false ,
]);
$ slugify -> slugify ( " FooBar " ); // -> "foo-bar"
Por defecto, Slugify utilizará guiones como separadores. Si desea utilizar un separador predeterminado diferente, puede configurar la opción separator
.
$ slugify = new Slugify ([ " separator " => " _ " ]);
$ slugify -> slugify ( " Hello World " ); // -> "hello_world"
De forma predeterminada, Slugify eliminará los separadores iniciales y finales antes de devolver el slug. Si no desea que se recorte el slug, puede configurar la opción trim
en falso.
$ slugify = new Slugify ([ " trim " => false ]);
$ slugify -> slugify ( " Hello World " ); // -> "hello-world-"
Puede sobrescribir cualquiera de las opciones anteriores sobre la marcha pasando una matriz de opciones como segundo argumento del método slugify()
. Por ejemplo:
$ slugify = new Slugify ();
$ slugify -> slugify ( " Hello World " , [ " lowercase " => false ]); // -> "Hello-World"
También puedes modificar el separador de esta manera:
$ slugify = new Slugify ();
$ slugify -> slugify ( " Hello World " , [ " separator " => " _ " ]); // -> "hello_world"
Incluso puedes activar un conjunto de reglas personalizado sin tocar las reglas predeterminadas:
$ slugify = new Slugify ();
$ slugify -> slugify ( " für " , [ " ruleset " => " turkish " ]); // -> "fur"
$ slugify -> slugify ( " für " ); // -> "fuer"
Realmente apreciamos si informa errores y fallas en la transliteración, especialmente si es un hablante nativo del idioma y la pregunta. No dude en solicitar idiomas adicionales en los números, pero tenga en cuenta que el responsable de este repositorio no habla todos los idiomas. Si puede proporcionar una solicitud de extracción con reglas para un nuevo idioma o ampliar las reglas para un idioma existente, sería fantástico.
Para agregar un nuevo idioma necesita:
[language].json
en Resources/rules
CocurSlugifySlugify::$options
. Si agrega el idioma allí, todas las pruebas existentes aún deben pasarphp bin/generate-default.php
tests/SlugifyTest.php
. Si el idioma está en el conjunto de reglas predeterminado, agregue sus casos de prueba a defaultRuleProvider()
; de lo contrario, a customRulesProvider()
.Enviar relaciones públicas. Muchas gracias.
Con el fin de fomentar un ambiente abierto y acogedor, nosotros, como contribuyentes y mantenedores, nos comprometemos a hacer de la participación en nuestro proyecto y nuestra comunidad una experiencia libre de acoso para todos, independientemente de su edad, tamaño corporal, discapacidad, origen étnico, identidad y expresión de género. nivel de experiencia, nacionalidad, apariencia personal, raza, religión o identidad y orientación sexual.
El Código de conducta completo se puede encontrar aquí.
Este proyecto no es lugar para el odio. Si tiene algún problema, comuníquese con Florian: [email protected]
Slugify contiene un paquete Symfony y una definición de servicio que le permiten usarlo como un servicio en su aplicación Symfony. El código reside en CocurSlugifyBridgeSymfonyCocurSlugifyBundle
y sólo necesitas activarlo:
El soporte para Symfony 2 se eliminó en 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 ],
];
Ahora puede utilizar el servicio cocur_slugify
en cualquier lugar de su aplicación, por ejemplo, en su controlador:
$ slug = $ this -> get ( " cocur_slugify " )-> slugify ( " Hello World! " );
El paquete también proporciona un alias slugify
para el servicio cocur_slugify
:
$ slug = $ this -> get ( " slugify " )-> slugify ( " Hello World! " );
Si usas autowire
(Symfony >=3.3), puedes inyectarlo en tus servicios de esta manera:
public function __construct( Cocur Slugify SlugifyInterface $ slugify )
Puede establecer los siguientes ajustes de configuración en config.yml
(Symfony 2-3) o config/packages/cocur_slugify.yaml
(Symfony 4) para ajustar el servicio 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
Si usa el marco Symfony con Twig, puede usar el filtro Twig slugify
en sus plantillas después de haber configurado las integraciones de Symfony (ver arriba).
{{ ' Hällo Wörld ' | slugify }}
Si usas Twig fuera del framework Symfony, primero necesitas agregar la extensión a tu entorno:
use Cocur Slugify Bridge Twig SlugifyExtension ;
use Cocur Slugify Slugify ;
$ twig = new Twig_Environment ( $ loader );
$ twig -> addExtension ( new SlugifyExtension (Slugify:: create ()));
Para usar el filtro Twig con TwigBridge para Laravel, necesitarás agregar la extensión Slugify usando un cierre:
// laravel/app/config/packages/rcrowe/twigbridge/config.php
' extensions ' => array (
//...
function () {
return new Cocur Slugify Bridge Twig SlugifyExtension ( Cocur Slugify Slugify:: create ());
},
),
Puede encontrar más información sobre cómo registrar extensiones en la documentación de Twig.
No necesitamos una integración adicional para usar Slugify en Moustache.php. Si desea utilizar Slugify en Moustache, simplemente agregue un ayudante:
use Cocur Slugify Slugify ;
$ mustache = new Mustache_Engine ([
// ...
" helpers " => [
" slugify " => function ( $ string , $ separator = null ) {
return Slugify:: create ()-> slugify ( $ string , $ separator );
},
],
]);
Slugify también proporciona un proveedor de servicios para integrarse en Laravel (versiones 4.1 y posteriores).
En el archivo app/config/app.php
de su proyecto Laravel, agregue el proveedor de servicios en la matriz "proveedores":
' providers ' => array (
" CocurSlugifyBridgeLaravelSlugifyServiceProvider " ,
)
Y agregue la fachada en la matriz "aliases":
' aliases ' => array (
" Slugify " => " CocurSlugifyBridgeLaravelSlugifyFacade " ,
)
Luego puedes usar el método Slugify::slugify()
en tus controladores:
$ url = Slugify:: slugify ( " welcome to the homepage " );
Slugify se puede utilizar fácilmente en aplicaciones Zend Framework 2. El puente incluido proporciona un servicio y un asistente de visualización ya registrado para usted.
Simplemente habilite el módulo en su configuración de esta manera.
return [
//...
" modules " => [
" Application " ,
" ZfcBase " ,
" CocurSlugifyBridgeZF2 " , // <- Add this line
//...
],
//...
];
Después de eso, puede recuperar el servicio CocurSlugifySlugify
(o el alias slugify
) y generar un slug.
/** @var ZendServiceManagerServiceManager $sm */
$ slugify = $ sm -> get ( " CocurSlugifySlugify " );
$ slug = $ slugify -> slugify ( " Hällo Wörld " );
$ anotherSlug = $ slugify -> slugify ( " Hällo Wörld " , " _ " );
En sus plantillas de vista, utilice el asistente slugify
para generar slugs.
<?php echo $ this -> slugify ( " Hällo Wörld " ); ?>
<?php echo $ this -> slugify ( " Hällo Wörld " , " _ " ); ?>
El servicio (que también se utiliza en el asistente de visualización) se puede personalizar definiendo esta clave de configuración.
return [
" cocur_slugify " => [
" reg_exp " => " /([^a-zA-Z0-9]|-)+/ " ,
],
];
Slugify contiene una extensión de Nette que le permite utilizarla como un servicio en su aplicación Nette. Sólo necesitas registrarlo en tu config.neon
:
# app/config/config.neon
extensions :
slugify : CocurSlugifyBridgeNetteSlugifyExtension
Ahora puede utilizar el servicio CocurSlugifySlugifyInterface
en cualquier lugar de su aplicación, por ejemplo en su presentador:
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 " );
}
}
Si usa Nette Framework con su motor de plantillas Latte nativo, puede usar el filtro Latte slugify
en sus plantillas después de haber configurado la extensión Nette (ver arriba).
{ $ hello |slugify }
Si usa Latte fuera de Nette Framework, primero debe agregar el filtro a su motor:
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 no necesita un puente específico para funcionar con Slim 3, solo agrega la siguiente configuración:
$ 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 ;
};
En una plantilla puedes usarlo así:
< a href = " /blog/{{ post . title | slugify }} " >{{ post . title | raw }}</ a ></ h5 >
Slugify proporciona un proveedor de servicios para usar con 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);
Puede configurarlo compartiendo las opciones requeridas:
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);
Puede configurar qué proveedor de reglas usar compartiéndolo:
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);
Soporte para Symfony 6.
La versión 4 no introduce nuevas características importantes, pero agrega soporte para Symfony 4 y 5, Twig 3 y, lo más importante, PHP 7.3 y 7.4.
Se elimina el soporte para PHP 5, Twig 1 y Silex.
composer.json
(por Wandersonwhcr)DefaultRuleProvider
(por gsouf)getName()
faltante a CocurSlugifyBridgeTwigSlugifyExtension
(por TomCan)DefaultRuleProvider
alfabéticamente (por tbmatuka)bindShared
con singleton
en el puente Laravel (por sunspikes)bindShared
con singleton
en el puente Laravel (por sunspikes)No hay nuevas funciones ni correcciones de errores, pero ya es hora de impulsar Slugify a la versión 1.0.
protected
(por acelaya)Ď
(por michalskop)Slugify
.Esta versión introduce integraciones opcionales en Symfony2, Silex y Twig. Aún puedes usar la biblioteca en cualquier otro marco. Decidí incluir estos puentes porque existen integraciones de otros desarrolladores, pero usan versiones obsoletas de cocur/slugify. Incluir estas pequeñas clases de bridge en la biblioteca me facilita mucho su mantenimiento.
$separator
que falta a SlugifyInterface
Código reescrito casi por completo, elimina la compatibilidad con iconv
porque la biblioteca subyacente está rota. El código ahora es mejor y más rápido. Muchas gracias a Marchenko Alexandr.
El soporte para chino está adaptado de jifei/Pinyin con permiso.
Slugify es un proyecto de Cocur. Puedes contactarnos en Twitter: @cocurco
Si necesita ayuda, puede preguntar en Twitter (bueno, solo si su pregunta es breve) o puede unirse a nuestro chat en Gitter.
En caso de que quieras apoyar el desarrollo de Slugify, puedes ayudarnos proporcionando transliteraciones adicionales o informarnos si una transliteración es incorrecta. Le agradeceríamos mucho que nos enviara directamente una solicitud de extracción en Github. Si nunca has contribuido a un proyecto en Github, estaremos encantados de ayudarte. Simplemente pregunte en Twitter o únase directamente a nuestro Gitter.
Siempre puedes ayudarme (Florian, el desarrollador y mantenedor original) enviándome uno o dos euros.
La licencia MIT (MIT)
Copyright (c) 2012-2017 Florian Eckerstorfer
Por el presente se otorga permiso, sin cargo, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para operar con el Software sin restricciones, incluidos, entre otros, los derechos de uso, copia, modificación, fusión. , publicar, distribuir, sublicenciar y/o vender copias del Software, y permitir que las personas a quienes se les proporciona el Software lo hagan, sujeto a las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO, PERO NO LIMITADO A, LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL SOFTWARE.