Comment convertir un titre en slug d'URL dans jQuery?

163

Je travaille sur une application dans CodeIgniter et j'essaie de créer un champ sur un formulaire pour générer dynamiquement le slug d'URL. Ce que j'aimerais faire, c'est supprimer la ponctuation, la convertir en minuscules et remplacer les espaces par des tirets. Ainsi, par exemple, Shane's Rib Shack deviendrait shanes-rib-shack.

Voici ce que j'ai jusqu'ici. La partie minuscule était facile, mais le remplacement ne semble pas fonctionner du tout, et je n'ai aucune idée de supprimer la ponctuation:

$("#Restaurant_Name").keyup(function(){
    var Text = $(this).val();
    Text = Text.toLowerCase();
    Text = Text.replace('/\s/g','-');
    $("#Restaurant_Slug").val(Text);    
});
GSto
la source
2
Pas jQuery, mais regardez dans les bibliothèques 'speakurl' ou 'node-slug'
Kevin Wheeler
... ou slugify
x-yuri

Réponses:

380

Je n'ai aucune idée d'où vient le terme `` limace '', mais on y va:

function convertToSlug(Text)
{
    return Text
        .toLowerCase()
        .replace(/ /g,'-')
        .replace(/[^\w-]+/g,'')
        ;
}

Le premier remplacement changera les espaces en traits d'union, le second remplacement supprime tout ce qui n'est pas alphanumérique, trait de soulignement ou trait d'union.

Si vous ne voulez pas que des choses "comme - ceci" se transforment en "comme --- ceci", vous pouvez utiliser celle-ci à la place:

function convertToSlug(Text)
{
    return Text
        .toLowerCase()
        .replace(/[^\w ]+/g,'')
        .replace(/ +/g,'-')
        ;
}

Cela supprimera les traits d'union (mais pas les espaces) lors du premier remplacement, et lors du second remplacement, les espaces consécutifs seront condensés en un seul trait d'union.

Donc "comme - ceci" sort comme "comme-ceci".

Peter Boughton
la source
1
n'oubliez pas d'ajouter "/" si vous avez besoin de plusieurs répertoires séparés
Val
6
le terme "slug" vient de wordpress
Brynner Ferreira
18
Pour éviter plusieurs tirets séquentiels, j'ai utilisé à la text.toLowerCase().replace(/ /g,'-').replace(/[-]+/g, '-').replace(/[^\w-]+/g,'');place de l'option 2. L'option 2 changera "th - is" en "this".
Ryan Allen
Comment autoriser également le point dans l'URL?
Idan Shechter le
Pour éviter "_" dans slug, remplacez .replace (/ + / g, '-') par .replace (/ + | _ / g, '-').
Odin Thunder
112
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;
};

et essaye

slug($('#field').val())

original par: http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/


EDIT: étendu pour plus de caractères spécifiques à la langue:

var from = "ÁÄÂÀÃÅČÇĆĎÉĚËÈÊẼĔȆĞÍÌÎÏİŇÑÓÖÒÔÕØŘŔŠŞŤÚŮÜÙÛÝŸŽáäâàãåčçćďéěëèêẽĕȇğíìîïıňñóöòôõøðřŕšşťúůüùûýÿžþÞĐđßÆa·/_,:;";
var to   = "AAAAAACCCDEEEEEEEEGIIIIINNOOOOOORRSSTUUUUUYYZaaaaaacccdeeeeeeeegiiiiinnooooooorrsstuuuuuyyzbBDdBAa------";
Taranttini
la source
6
Mais pas correctement. Dans les textes allemands, üdevrait être remplacé par ue, etc.
feklee
5
@feklee: "Pas correctement" est vrai pour l'allemand (et peut-être certaines autres langues), mais dans d'autres langues, c'est très bien. Pour un site en anglais, je voudrais que "Márföldi" (nom de famille d'origine hongroise) soit converti en "marfoldi", et non en "marfoeldi", comme le feraient les Allemands.
michalstanko
1
Pour assurer la compatibilité multiplateforme, vous pouvez remplacer par = "\ u00E3 \ u00E0 \ u00E1 \ u00E4 \ u00E2 \ u1EBD \ u00E8 \ u00E9 \ u00EB \ u00EA \ u00EC \ u00ED \ u00EF \ u00EE \ u00F5 \ u00F2 \ u00F3 \ \ u00F6 \ u00F4 \ u00F9 \ u00FA \ u00FC \ u00FB \ u00F1 \ u00E7 \ u00B7 / _,:; ";
Mike Godin
1
Belle solution! Manquer le scandinave åcependant.
Fredric
1
Vous pouvez ajouter İĞŞığşdes fromvariables et les convertir en pour IGSigsprendre en charge les caractères turcs.
CemilF
19

Tout d'abord, les expressions régulières ne doivent pas avoir de guillemets, donc '/ \ s / g' doit être / \ s / g

Afin de remplacer tous les caractères non alphanumériques par des tirets, cela devrait fonctionner (en utilisant votre exemple de code):

$("#Restaurant_Name").keyup(function(){
        var Text = $(this).val();
        Text = Text.toLowerCase();
        Text = Text.replace(/[^a-zA-Z0-9]+/g,'-');
        $("#Restaurant_Slug").val(Text);        
});

Cela devrait faire l'affaire...

Philippe Leybaert
la source
8

J'ai trouvé une bonne solution complète pour l'anglais

function slugify(string) {
  return string
    .toString()
    .trim()
    .toLowerCase()
    .replace(/\s+/g, "-")
    .replace(/[^\w\-]+/g, "")
    .replace(/\-\-+/g, "-")
    .replace(/^-+/, "")
    .replace(/-+$/, "");
}

Quelques exemples d'utilisation:

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"

Merci à Andrew Stewart

zahid9i
la source
8

J'espère que cela peut sauver la journée de quelqu'un ...

/* 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, '-');	
  document.getElementById("slug-text").innerHTML= str;
  //return str;
}
<input type="text" onload="convertToSlug(this.value)" onkeyup="convertToSlug(this.value)" value="Try it Yourself"/>
<p id="slug-text"></p>

bmatovu
la source
7

Tout ce dont vous aviez besoin était 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);        
});
karim79
la source
6

Jetez un œil à cette fonction slug pour nettoyer les URL, développée par Sean Murphy à 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;
}
Max
la source
1
Dans les commets, quelqu'un a dit: "Cela ne fonctionnera pas avec use strict dans les navigateurs IE11- en raison des doublons dans l'objet char_map."
BBaysinger
3

Je crée un plugin à implémenter dans la plupart des langues: http://leocaseiro.com.br/jquery-plugin-string-to-slug/

Utilisation par défaut:

$(document).ready( function() {
    $("#string").stringToSlug();
});

Est très facile a stringToSlug jQuery Plugin

Leo Caseiro
la source
3
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
}

* basé sur https://gist.github.com/mathewbyrne/1280286

maintenant vous pouvez transformer cette chaîne:

Barack_Obama       Барак_Обама ~!@#$%^&*()+/-+?><:";'{}[]\|`

dans:

barack_obama-барак_обама

application à votre code:

$("#Restaurant_Name").keyup(function(){
    var Text = $(this).val();
    Text = slugify(Text);
    $("#Restaurant_Slug").val(Text);
});
Alexander Ivashchenko
la source
Je ne sais pas pourquoi cette réponse n'est pas sélectionnée. Beaucoup de réponses ne comptent pas sur la suppression de # ou? du slug - les URL sont endommagées de cette façon. Même les bibliothèques de réactions les plus utilisées n'ont pas cette fonctionnalité implémentée. Cette réponse est très simple, mais universelle.
Vladimir Marton
3

La combinaison d'une variété d'éléments des réponses ici avec normaliser fournit une bonne couverture. Gardez l'ordre des opérations pour nettoyer progressivement l'URL.

function clean_url(s) {
    return s.toString().normalize('NFD').replace(/[\u0300-\u036f]/g, "") //remove diacritics
            .toLowerCase()
            .replace(/\s+/g, '-') //spaces to dashes
            .replace(/&/g, '-and-') //ampersand to and
            .replace(/[^\w\-]+/g, '') //remove non-words
            .replace(/\-\-+/g, '-') //collapse multiple dashes
            .replace(/^-+/, '') //trim starting dash
            .replace(/-+$/, ''); //trim ending dash
}

normlize('NFD')divise les caractères accentués en leurs composants, qui sont des lettres de base plus des signes diacritiques (la partie accentuée). replace(/[\u0300-\u036f]/g, "")purge tous les signes diacritiques, laissant les lettres de base par elles-mêmes. Le reste est expliqué avec des commentaires en ligne.

OXiGÈNE
la source
1
Merci. Ceci est simple et fonctionne bien avec mes cas de test. Même le caractère vietnamien `` `` const testCases = [{input: 'is it a good slug' ', expect:' is-it-a-good-slug '}, {input:' ----- is --- --it ----- a ----- bon ----- limace ----- ', attendez-vous à:' est-ce-un-bon-limace '}, {entrée:' CÔNG cha như núi Thái Sơn ', attendez:' cong-cha-nhu-nui-thai-son '}, {input:' -Haha - Nhất-Nguyễn ', attendez:' haha-nhat-nguyen '}] ``
Phat Tran Ky
1

Vous pouvez utiliser votre propre fonction pour cela.

essayez-le: 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;
    });
});
MGE
la source
Quelle est la différence entre cette solution et la réponse hautement votée ci-dessus?
nilsi
code mis à jour ici, pour supprimer le dernier caractère si est "-" jsfiddle.net/xstLr7aj/36
MGE
1

La réponse acceptée ne répondait pas à mes besoins (elle autorise les traits de soulignement, ne gère pas les tirets au début et à la fin, etc.), et les autres réponses avaient d'autres problèmes qui ne correspondaient pas à mon cas d'utilisation, alors voici la fonction slugify Je suis venu avec:

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.
}

Cela transformera 'foo !!! BAR _-_-_ baz-' (notez l'espace au début) en foo-bar-baz.

Justin Michael
la source
1

Vous voudrez peut-être jeter un coup d'œil au plugin speakURL et vous pourrez alors:

    $("#Restaurant_Name").on("keyup", function () {
        var slug = getSlug($("#Restaurant_Name").val());
        $("#Restaurant_Slug").val(slug);
    });
Kornel
la source
1

Encore un autre. Court et garde les caractères spéciaux:

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
}
Lucas Bustamante
la source
1

Méthode de génération de slug plus puissante sur JavaScript pur. Il prend essentiellement en charge la translittération pour tous les caractères cyrilliques et de nombreux trémas (allemand, danois, français, turc, ukrainien, etc.) mais peut être facilement étendu.

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 = [/(&nbsp;|&#160;|&#32;)/gi, /(&mdash;|&ndash;|&#8209;)/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 &amp;
  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/> &#x202A;Про&amp;вер<strong>ка_тран</strong>с…литеърьации\rюга\nи&ndash;южного&nbsp;округа\t \nс\tёжикам&#180;и&nbsp;со\\всеми&ndash;друзьями\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>

anakod
la source
1

Pour les personnes utilisant déjà lodash

La plupart de ces exemples sont vraiment bons et couvrent de nombreux cas. Mais si vous `` savez '' que vous n'avez que du texte anglais, voici ma version qui est super facile à lire :)

_.words(_.toLower(text)).join('-')

Frexuz
la source
1

Eh bien, après avoir lu les réponses, j'ai trouvé celle-ci.

    const generateSlug = (text) => text.toLowerCase().trim().replace(/[^\w- ]+/g, '').replace(/ /g, '-').replace(/[-]+/g, '-');
Siraj Alam
la source
1

Remarque: si vous ne vous souciez pas d'un argument contre la réponse acceptée et que vous cherchez simplement une réponse, sautez la section suivante, vous trouverez ma réponse proposée à la fin

la réponse acceptée a quelques problèmes (à mon avis):

1) comme pour le premier extrait de fonction:

aucun égard pour plusieurs espaces blancs consécutifs

contribution: is it a good slug

reçu: ---is---it---a---good---slug---

attendu: is-it-a-good-slug

pas de considération pour plusieurs tirets consécutifs

contribution: -----is-----it-----a-----good-----slug-----

reçu: -----is-----it-----a-----good-----slug-----

attendu: is-it-a-good-slug

veuillez noter que cette implémentation ne gère pas les tirets externes (ou les espaces blancs d'ailleurs) qu'il s'agisse de plusieurs caractères consécutifs ou de caractères singuliers qui (pour autant que je comprends les slugs et leur utilisation) ne sont pas valides

2) comme pour le deuxième extrait de fonction:

il prend en charge les multiples espaces consécutifs en les convertissant en un seul -mais ce n'est pas suffisant car les espaces externes (au début et à la fin de la chaîne) sont gérés de la même manière, donc is it a good slugretournerait-is-it-a-good-slug-

il supprime également complètement les tirets de l'entrée qui convertit quelque chose comme --is--it--a--good--slug--'en isitagoodslug, l'extrait de code dans le commentaire de @ ryan-allen s'en charge, laissant le problème des tirets externes non résolu

maintenant je sais qu'il n'y a pas de définition standard pour les slugs, et la réponse acceptée peut faire le travail (que l'utilisateur qui a posté la question recherchait), mais c'est la question SO la plus populaire sur les slugs dans JS, donc ces problèmes devait être souligné, aussi (concernant faire le travail! ) imaginez taper cette abomination d'une URL ( www.blog.com/posts/-----how-----to-----slugify-----a-----string-----) ou même simplement être redirigé vers elle au lieu de quelque chose comme ( www.blog.com/posts/how-to-slugify-a-string), je sais que c'est un cas extrême mais bon c'est ce que teste sont pour.

une meilleure solution , à mon avis, serait la suivante:

const slugify = str =>
  str
  .trim()                      // remove whitespaces at the start and end of string
  .toLowerCase()              
  .replace(/^-+/g, "")         // remove one or more dash at the start of the string
  .replace(/[^\w-]+/g, "-")    // convert any on-alphanumeric character to a dash
  .replace(/-+/g, "-")         // convert consecutive dashes to singuar one
  .replace(/-+$/g, "");        // remove one or more dash at the end of the string

maintenant, il y a probablement un ninja RegExp qui peut convertir cela en une expression à une seule ligne, je ne suis pas un expert en RegExp et je ne dis pas que c'est la solution la meilleure ou la plus compacte ou celle avec les meilleures performances mais j'espère qu'il pourra faire le travail.

Waddah
la source
Cela a un défaut où la conversion de caractères non alphanumériques en tirets restaurera éventuellement un tiret au début de la ligne. Mais s'il vous plaît, n'en faites pas une seule ligne. Celui-ci est facile à comprendre!
Timo le
1
$("#Restaurant_Name").keyup(function(){
        var Text = $(this).val();
        Text = Text.toLowerCase();
        Text = Text.replace(/[^a-zA-Z0-9]+/g,'-');
        $("#Restaurant_Slug").val(Text);        
});

Ce code fonctionne

Deepak K. sah
la source
Je vous remercie! C'est plus facile à utiliser.
Jane Doe
0
//
//  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;
    };

Cela m'a aidé avec le même problème!

Marko Ranković
la source
0
function slugify(content) {
   return content.toLowerCase().replace(/ /g,'-').replace(/[^\w-]+/g,'');
}
// slugify('Hello World');
// this will return 'hello-world';

cela fonctionne bien pour moi.

Je l'ai trouvé sur CodeSnipper

Al Quarashi
la source
-5
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();
}

la source