javascript - jquery plugin string to slug
¿Cómo convertir un título a una URL slug en jQuery? (17)
Creé un complemento para implementar en la mayoría de los idiomas: http://leocaseiro.com.br/jquery-plugin-string-to-slug/
Uso predeterminado:
$(document).ready( function() {
$("#string").stringToSlug();
});
Es muy fácil el plugin jQuery de stringToSlug
Estoy trabajando en una aplicación en CodeIgniter, y estoy tratando de crear un campo en un formulario que genere dinámicamente la URL slug. Lo que me gustaría hacer es eliminar la puntuación, convertirla a minúsculas y reemplazar los espacios con guiones. Entonces, por ejemplo, Shane''s Rib Shack se convertiría en shanes-rib-shack.
Esto es lo que tengo hasta ahora. La parte en minúscula fue fácil, pero el reemplazo no parece funcionar del todo, y no tengo idea de eliminar la puntuación:
$("#Restaurant_Name").keyup(function(){
var Text = $(this).val();
Text = Text.toLowerCase();
Text = Text.replace(''//s/g'',''-'');
$("#Restaurant_Slug").val(Text);
});
Eche un vistazo a esta función slug para desinfectar las URL, desarrollada por Sean Murphy en https://gist.github.com/sgmurphy/3095196
/**
* Create a web friendly URL slug from a string.
*
* Requires XRegExp (http://xregexp.com) with unicode add-ons for UTF-8 support.
*
* Although supported, transliteration is discouraged because
* 1) most web browsers support UTF-8 characters in URLs
* 2) transliteration causes a loss of information
*
* @author Sean Murphy <[email protected]>
* @copyright Copyright 2012 Sean Murphy. All rights reserved.
* @license http://creativecommons.org/publicdomain/zero/1.0/
*
* @param string s
* @param object opt
* @return string
*/
function url_slug(s, opt) {
s = String(s);
opt = Object(opt);
var defaults = {
''delimiter'': ''-'',
''limit'': undefined,
''lowercase'': true,
''replacements'': {},
''transliterate'': (typeof(XRegExp) === ''undefined'') ? true : false
};
// Merge options
for (var k in defaults) {
if (!opt.hasOwnProperty(k)) {
opt[k] = defaults[k];
}
}
var char_map = {
// Latin
''À'': ''A'', ''Á'': ''A'', ''Â'': ''A'', ''Ã'': ''A'', ''Ä'': ''A'', ''Å'': ''A'', ''Æ'': ''AE'', ''Ç'': ''C'',
''È'': ''E'', ''É'': ''E'', ''Ê'': ''E'', ''Ë'': ''E'', ''Ì'': ''I'', ''Í'': ''I'', ''Î'': ''I'', ''Ï'': ''I'',
''Ð'': ''D'', ''Ñ'': ''N'', ''Ò'': ''O'', ''Ó'': ''O'', ''Ô'': ''O'', ''Õ'': ''O'', ''Ö'': ''O'', ''Ő'': ''O'',
''Ø'': ''O'', ''Ù'': ''U'', ''Ú'': ''U'', ''Û'': ''U'', ''Ü'': ''U'', ''Ű'': ''U'', ''Ý'': ''Y'', ''Þ'': ''TH'',
''ß'': ''ss'',
''à'': ''a'', ''á'': ''a'', ''â'': ''a'', ''ã'': ''a'', ''ä'': ''a'', ''å'': ''a'', ''æ'': ''ae'', ''ç'': ''c'',
''è'': ''e'', ''é'': ''e'', ''ê'': ''e'', ''ë'': ''e'', ''ì'': ''i'', ''í'': ''i'', ''î'': ''i'', ''ï'': ''i'',
''ð'': ''d'', ''ñ'': ''n'', ''ò'': ''o'', ''ó'': ''o'', ''ô'': ''o'', ''õ'': ''o'', ''ö'': ''o'', ''ő'': ''o'',
''ø'': ''o'', ''ù'': ''u'', ''ú'': ''u'', ''û'': ''u'', ''ü'': ''u'', ''ű'': ''u'', ''ý'': ''y'', ''þ'': ''th'',
''ÿ'': ''y'',
// Latin symbols
''©'': ''(c)'',
// Greek
''Α'': ''A'', ''Β'': ''B'', ''Γ'': ''G'', ''Δ'': ''D'', ''Ε'': ''E'', ''Ζ'': ''Z'', ''Η'': ''H'', ''Θ'': ''8'',
''Ι'': ''I'', ''Κ'': ''K'', ''Λ'': ''L'', ''Μ'': ''M'', ''Ν'': ''N'', ''Ξ'': ''3'', ''Ο'': ''O'', ''Π'': ''P'',
''Ρ'': ''R'', ''Σ'': ''S'', ''Τ'': ''T'', ''Υ'': ''Y'', ''Φ'': ''F'', ''Χ'': ''X'', ''Ψ'': ''PS'', ''Ω'': ''W'',
''Ά'': ''A'', ''Έ'': ''E'', ''Ί'': ''I'', ''Ό'': ''O'', ''Ύ'': ''Y'', ''Ή'': ''H'', ''Ώ'': ''W'', ''Ϊ'': ''I'',
''Ϋ'': ''Y'',
''α'': ''a'', ''β'': ''b'', ''γ'': ''g'', ''δ'': ''d'', ''ε'': ''e'', ''ζ'': ''z'', ''η'': ''h'', ''θ'': ''8'',
''ι'': ''i'', ''κ'': ''k'', ''λ'': ''l'', ''μ'': ''m'', ''ν'': ''n'', ''ξ'': ''3'', ''ο'': ''o'', ''π'': ''p'',
''ρ'': ''r'', ''σ'': ''s'', ''τ'': ''t'', ''υ'': ''y'', ''φ'': ''f'', ''χ'': ''x'', ''ψ'': ''ps'', ''ω'': ''w'',
''ά'': ''a'', ''έ'': ''e'', ''ί'': ''i'', ''ό'': ''o'', ''ύ'': ''y'', ''ή'': ''h'', ''ώ'': ''w'', ''ς'': ''s'',
''ϊ'': ''i'', ''ΰ'': ''y'', ''ϋ'': ''y'', ''ΐ'': ''i'',
// Turkish
''Ş'': ''S'', ''İ'': ''I'', ''Ç'': ''C'', ''Ü'': ''U'', ''Ö'': ''O'', ''Ğ'': ''G'',
''ş'': ''s'', ''ı'': ''i'', ''ç'': ''c'', ''ü'': ''u'', ''ö'': ''o'', ''ğ'': ''g'',
// Russian
''А'': ''A'', ''Б'': ''B'', ''В'': ''V'', ''Г'': ''G'', ''Д'': ''D'', ''Е'': ''E'', ''Ё'': ''Yo'', ''Ж'': ''Zh'',
''З'': ''Z'', ''И'': ''I'', ''Й'': ''J'', ''К'': ''K'', ''Л'': ''L'', ''М'': ''M'', ''Н'': ''N'', ''О'': ''O'',
''П'': ''P'', ''Р'': ''R'', ''С'': ''S'', ''Т'': ''T'', ''У'': ''U'', ''Ф'': ''F'', ''Х'': ''H'', ''Ц'': ''C'',
''Ч'': ''Ch'', ''Ш'': ''Sh'', ''Щ'': ''Sh'', ''Ъ'': '''', ''Ы'': ''Y'', ''Ь'': '''', ''Э'': ''E'', ''Ю'': ''Yu'',
''Я'': ''Ya'',
''а'': ''a'', ''б'': ''b'', ''в'': ''v'', ''г'': ''g'', ''д'': ''d'', ''е'': ''e'', ''ё'': ''yo'', ''ж'': ''zh'',
''з'': ''z'', ''и'': ''i'', ''й'': ''j'', ''к'': ''k'', ''л'': ''l'', ''м'': ''m'', ''н'': ''n'', ''о'': ''o'',
''п'': ''p'', ''р'': ''r'', ''с'': ''s'', ''т'': ''t'', ''у'': ''u'', ''ф'': ''f'', ''х'': ''h'', ''ц'': ''c'',
''ч'': ''ch'', ''ш'': ''sh'', ''щ'': ''sh'', ''ъ'': '''', ''ы'': ''y'', ''ь'': '''', ''э'': ''e'', ''ю'': ''yu'',
''я'': ''ya'',
// Ukrainian
''Є'': ''Ye'', ''І'': ''I'', ''Ї'': ''Yi'', ''Ґ'': ''G'',
''є'': ''ye'', ''і'': ''i'', ''ї'': ''yi'', ''ґ'': ''g'',
// Czech
''Č'': ''C'', ''Ď'': ''D'', ''Ě'': ''E'', ''Ň'': ''N'', ''Ř'': ''R'', ''Š'': ''S'', ''Ť'': ''T'', ''Ů'': ''U'',
''Ž'': ''Z'',
''č'': ''c'', ''ď'': ''d'', ''ě'': ''e'', ''ň'': ''n'', ''ř'': ''r'', ''š'': ''s'', ''ť'': ''t'', ''ů'': ''u'',
''ž'': ''z'',
// Polish
''Ą'': ''A'', ''Ć'': ''C'', ''Ę'': ''e'', ''Ł'': ''L'', ''Ń'': ''N'', ''Ó'': ''o'', ''Ś'': ''S'', ''Ź'': ''Z'',
''Ż'': ''Z'',
''ą'': ''a'', ''ć'': ''c'', ''ę'': ''e'', ''ł'': ''l'', ''ń'': ''n'', ''ó'': ''o'', ''ś'': ''s'', ''ź'': ''z'',
''ż'': ''z'',
// Latvian
''Ā'': ''A'', ''Č'': ''C'', ''Ē'': ''E'', ''Ģ'': ''G'', ''Ī'': ''i'', ''Ķ'': ''k'', ''Ļ'': ''L'', ''Ņ'': ''N'',
''Š'': ''S'', ''Ū'': ''u'', ''Ž'': ''Z'',
''ā'': ''a'', ''č'': ''c'', ''ē'': ''e'', ''ģ'': ''g'', ''ī'': ''i'', ''ķ'': ''k'', ''ļ'': ''l'', ''ņ'': ''n'',
''š'': ''s'', ''ū'': ''u'', ''ž'': ''z''
};
// Make custom replacements
for (var k in opt.replacements) {
s = s.replace(RegExp(k, ''g''), opt.replacements[k]);
}
// Transliterate characters to ASCII
if (opt.transliterate) {
for (var k in char_map) {
s = s.replace(RegExp(k, ''g''), char_map[k]);
}
}
// Replace non-alphanumeric characters with our delimiter
var alnum = (typeof(XRegExp) === ''undefined'') ? RegExp(''[^a-z0-9]+'', ''ig'') : XRegExp(''[^//p{L}//p{N}]+'', ''ig'');
s = s.replace(alnum, opt.delimiter);
// Remove duplicate delimiters
s = s.replace(RegExp(''['' + opt.delimiter + '']{2,}'', ''g''), opt.delimiter);
// Truncate slug to max. characters
s = s.substring(0, opt.limit);
// Remove delimiter from ends
s = s.replace(RegExp(''(^'' + opt.delimiter + ''|'' + opt.delimiter + ''$)'', ''g''), '''');
return opt.lowercase ? s.toLowerCase() : s;
}
En primer lugar, las expresiones regulares no deben tener comillas circundantes, por lo que ''/ / s / g'' debe ser / / s / g
Para reemplazar todos los caracteres no alfanuméricos con guiones, esto debería funcionar (usando su código de ejemplo):
$("#Restaurant_Name").keyup(function(){
var Text = $(this).val();
Text = Text.toLowerCase();
Text = Text.replace(/[^a-zA-Z0-9]+/g,''-'');
$("#Restaurant_Slug").val(Text);
});
Eso debería hacer el truco...
Encontré una buena y completa solución para el inglés
function slugify(string) {
return string
.toString()
.trim()
.toLowerCase()
.replace(//s+/g, "-")
.replace(/[^/w/-]+/g, "")
.replace(//-/-+/g, "-")
.replace(/^-+/, "")
.replace(/-+$/, "");
}
Algunos ejemplos de esto en uso:
slugify(12345);
// "12345"
slugify(" string with leading and trailing whitespace ");
// "string-with-leading-and-trailing-whitespace"
slugify("mIxEd CaSe TiTlE");
// "mixed-case-title"
slugify("string with - existing hyphens -- ");
// "string-with-existing-hyphens"
slugify("string with Special™ characters");
// "string-with-special-characters"
Gracias a Andrew Stewart
Es posible que desee echar un vistazo al plugin speakingURL y luego simplemente podría:
$("#Restaurant_Name").on("keyup", function () {
var slug = getSlug($("#Restaurant_Name").val());
$("#Restaurant_Slug").val(slug);
});
Espero que esto pueda salvar el día de alguien ...
/* Encode string to slug */
function convertToSlug( str ) {
//replace all special characters | symbols with a space
str = str.replace(/[`~!@#$%^&*()_/-+=/[/]{};:''"//|//,.<>?/s]/g, '' '').toLowerCase();
// trim spaces at start and end of string
str = str.replace(/^/s+|/s+$/gm,'''');
// replace space with dash/hyphen
str = str.replace(//s+/g, ''-'');
return str;
}
La respuesta aceptada no satisfacía mis necesidades (permite guiones bajos, no maneja guiones al principio y al final, etc.), y las otras respuestas tenían otros problemas que no se adaptaban a mi caso de uso, así que aquí está la función slugify Se me ocurrio:
function slugify(string) {
return string.trim() // Remove surrounding whitespace.
.toLowerCase() // Lowercase.
.replace(/[^a-z0-9]+/g,''-'') // Find everything that is not a lowercase letter or number, one or more times, globally, and replace it with a dash.
.replace(/^-+/, '''') // Remove all dashes from the beginning of the string.
.replace(/-+$/, ''''); // Remove all dashes from the end of the string.
}
Esto hará que ''foo !!! BAR _-_-_ baz-'' (nótese el espacio al principio) en foo-bar-baz
.
Método de generación de slug más poderoso en JavaScript puro. Básicamente es transliteración de soporte para todos los caracteres cirílicos y muchos diéresis (alemán, danés, francés, turco, ucraniano, etc.) pero puede ampliarse fácilmente.
function makeSlug(str)
{
var from="а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ā ą ä á à â å č ć ē ę ě é è ê æ ģ ğ ö ó ø ǿ ô ő ḿ ʼn ń ṕ ŕ ş ü ß ř ł đ þ ĥ ḧ ī ï í î ĵ ķ ł ņ ń ň ř š ś ť ů ú û ứ ù ü ű ū ý ÿ ž ź ż ç є ґ".split('' '');
var to= "a b v g d e e zh z i y k l m n o p r s t u f h ts ch sh shch # y # e yu ya a a ae a a a a c c e e e e e e e g g oe o o o o o m n n p r s ue ss r l d th h h i i i i j k l n n n r s s t u u u u u u u u y y z z z c ye g".split('' '');
str = str.toLowerCase();
// remove simple HTML tags
str = str.replace(/(<[a-z0-9/-]{1,15}[/s]*>)/gi, '''');
str = str.replace(/(<//[a-z0-9/-]{1,15}[/s]*>)/gi, '''');
str = str.replace(/(<[a-z0-9/-]{1,15}[/s]*//>)/gi, '''');
str = str.replace(/^/s+|/s+$/gm,''''); // trim spaces
for(i=0; i<from.length; ++i)
str = str.split(from[i]).join(to[i]);
// Replace different kind of spaces with dashes
var spaces = [/( | | )/gi, /(—|–|‑)/gi,
/[(_|=|//|/,|/.|!)]+/gi, //s/gi];
for(i=0; i<from.length; ++i)
str = str.replace(spaces[i], ''-'');
str = str.replace(/-{2,}/g, "-");
// remove special chars like &
str = str.replace(/&[a-z]{2,7};/gi, '''');
str = str.replace(/&#[0-9]{1,6};/gi, '''');
str = str.replace(/&#x[0-9a-f]{1,6};/gi, '''');
str = str.replace(/[^a-z0-9/-]+/gmi, ""); // remove all other stuff
str = str.replace(/^/-+|/-+$/gm,''''); // trim edges
return str;
};
document.getElementsByTagName(''pre'')[0].innerHTML = makeSlug(" <br/> ‪Про&вер<strong>ка_тран</strong>с…литеърьации/rюга/nи–южного округа/t /nс/tёжикам´и со//всеми–друзьями/tтоже.Danke schön!ich heiße=КáÞÿá-Skånske,København çağatay rí gé tőr zöldülésetekről - . ");
<div>
<pre>Hello world!</pre>
</div>
No tengo idea de dónde vino el término ''slug'', pero aquí vamos:
function convertToSlug(Text)
{
return Text
.toLowerCase()
.replace(/ /g,''-'')
.replace(/[^/w-]+/g,'''')
;
}
Primero reemplazar cambiará espacios por guiones, en segundo lugar se eliminará cualquier cosa que no sea alfanumérica, guión bajo o guión.
Si no quieres que las cosas "como - esto" se conviertan en "me gusta - esto" entonces puedes usar este:
function convertToSlug(Text)
{
return Text
.toLowerCase()
.replace(/[^/w ]+/g,'''')
.replace(/ +/g,''-'')
;
}
Eso eliminará los guiones (pero no los espacios) en el primer reemplazo, y en el segundo reemplazo, condensará espacios consecutivos en un solo guión.
Entonces "like - this" sale como "like-this".
Puedes usar tu propia función para esto.
pruébalo: http://jsfiddle.net/xstLr7aj/
function string_to_slug(str) {
str = str.replace(/^/s+|/s+$/g, ''''); // trim
str = str.toLowerCase();
// remove accents, swap ñ for n, etc
var from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;";
var to = "aaaaeeeeiiiioooouuuunc------";
for (var i=0, l=from.length ; i<l ; i++) {
str = str.replace(new RegExp(from.charAt(i), ''g''), to.charAt(i));
}
str = str.replace(/[^a-z0-9 -]/g, '''') // remove invalid chars
.replace(//s+/g, ''-'') // collapse whitespace and replace by -
.replace(/-+/g, ''-''); // collapse dashes
return str;
}
$(document).ready(function() {
$(''#test'').submit(function(){
var val = string_to_slug($(''#t'').val());
alert(val);
return false;
});
});
Sin embargo, otro más. Corto y mantiene caracteres especiales:
imaginação é mato => imaginacao-e-mato
function slugify (text) {
const a = ''àáäâãèéëêìíïîòóöôùúüûñçßÿœæŕśńṕẃǵǹḿǘẍźḧ·/_,:;''
const b = ''aaaaaeeeeiiiioooouuuuncsyoarsnpwgnmuxzh------''
const p = new RegExp(a.split('''').join(''|''), ''g'')
return text.toString().toLowerCase()
.replace(//s+/g, ''-'') // Replace spaces with -
.replace(p, c =>
b.charAt(a.indexOf(c))) // Replace special chars
.replace(/&/g, ''-and-'') // Replace & with ''and''
.replace(/[^/w/-]+/g, '''') // Remove all non-word chars
.replace(//-/-+/g, ''-'') // Replace multiple - with single -
.replace(/^-+/, '''') // Trim - from start of text
.replace(/-+$/, '''') // Trim - from end of text
}
Todo lo que necesitabas era un plus :)
$("#Restaurant_Name").keyup(function(){
var Text = $(this).val();
Text = Text.toLowerCase();
var regExp = //s+/g;
Text = Text.replace(regExp,''-'');
$("#Restaurant_Slug").val(Text);
});
Para personas que ya usan lodash
La mayoría de estos ejemplos son realmente buenos y cubren muchos casos. Pero si ''sabes'' que solo tienes texto en inglés, aquí está mi versión que es súper fácil de leer :)
_.words(_.toLower(text)).join(''-'')
//
// jQuery Slug Plugin by Perry Trinier ([email protected])
// MIT License: http://www.opensource.org/licenses/mit-license.php
jQuery.fn.slug = function(options) {
var settings = {
slug: ''slug'', // Class used for slug destination input and span. The span is created on $(document).ready()
hide: true // Boolean - By default the slug input field is hidden, set to false to show the input field and hide the span.
};
if(options) {
jQuery.extend(settings, options);
}
$this = $(this);
$(document).ready( function() {
if (settings.hide) {
$(''input.'' + settings.slug).after("<span class="+settings.slug+"></span>");
$(''input.'' + settings.slug).hide();
}
});
makeSlug = function() {
var slug = jQuery.trim($this.val()) // Trimming recommended by Brooke Dukes - http://www.thewebsitetailor.com/2008/04/jquery-slug-plugin/comment-page-1/#comment-23
.replace(//s+/g,''-'').replace(/[^a-zA-Z0-9/-]/g,'''').toLowerCase() // See http://www.djangosnippets.org/snippets/1488/
.replace(//-{2,}/g,''-''); // If we end up with any ''multiple hyphens'', replace with just one. Temporary bugfix for input ''this & that''=>''this--that''
$(''input.'' + settings.slug).val(slug);
$(''span.'' + settings.slug).text(slug);
}
$(this).keyup(makeSlug);
return $this;
};
¡Esto me ayudó con el mismo problema!
function slugify(text){
return text.toString().toLowerCase()
.replace(//s+/g, ''-'') // Replace spaces with -
.replace(/[^/u0100-/uFFFF/w/-]/g,''-'') // Remove all non-word chars ( fix for UTF-8 chars )
.replace(//-/-+/g, ''-'') // Replace multiple - with single -
.replace(/^-+/, '''') // Trim - from start of text
.replace(/-+$/, ''''); // Trim - from end of text
}
* basado en gist.github.com/mathewbyrne/1280286
ahora puedes transformar esta cadena:
Barack_Obama Барак_Обама ~!@#$%^&*()+/-+?><:";''{}[]/|`
dentro:
barack_obama-барак_обама
aplicando a tu código:
$("#Restaurant_Name").keyup(function(){
var Text = $(this).val();
Text = slugify(Text);
$("#Restaurant_Slug").val(Text);
});
private string ToSeoFriendly(string title, int maxLength) {
var match = Regex.Match(title.ToLower(), "[//w]+");
StringBuilder result = new StringBuilder("");
bool maxLengthHit = false;
while (match.Success && !maxLengthHit) {
if (result.Length + match.Value.Length <= maxLength) {
result.Append(match.Value + "-");
} else {
maxLengthHit = true;
// Handle a situation where there is only one word and it is greater than the max length.
if (result.Length == 0) result.Append(match.Value.Substring(0, maxLength));
}
match = match.NextMatch();
}
// Remove trailing ''-''
if (result[result.Length - 1] == ''-'') result.Remove(result.Length - 1, 1);
return result.ToString();
}
var slug = function(str) {
str = str.replace(/^/s+|/s+$/g, ''''); // trim
str = str.toLowerCase();
// remove accents, swap ñ for n, etc
var from = "ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;";
var to = "aaaaaeeeeeiiiiooooouuuunc------";
for (var i=0, l=from.length ; i<l ; i++) {
str = str.replace(new RegExp(from.charAt(i), ''g''), to.charAt(i));
}
str = str.replace(/[^a-z0-9 -]/g, '''') // remove invalid chars
.replace(//s+/g, ''-'') // collapse whitespace and replace by -
.replace(/-+/g, ''-''); // collapse dashes
return str;
};
y prueba
slug($(''#field'').val())
original por: http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/
EDITAR: extendido para más caracteres específicos del idioma:
var from = "ÁÄÂÀÃÅČÇĆĎÉĚËÈÊẼĔȆÍÌÎÏŇÑÓÖÒÔÕØŘŔŠŤÚŮÜÙÛÝŸŽáäâàãåčçćďéěëèêẽĕȇíìîïňñóöòôõøðřŕšťúůüùûýÿžþÞĐđßÆa·/_,:;";
var to = "AAAAAACCCDEEEEEEEEIIIINNOOOOOORRSTUUUUUYYZaaaaaacccdeeeeeeeeiiiinnooooooorrstuuuuuyyzbBDdBAa------";