Wie konvertiere ich einen Titel in einen URL-Slug in jQuery?

163

Ich arbeite an einer App in CodeIgniter und versuche, ein Feld in einem Formular so zu gestalten, dass der URL-Slug dynamisch generiert wird. Ich möchte die Interpunktion entfernen, in Kleinbuchstaben konvertieren und die Leerzeichen durch Bindestriche ersetzen. So würde beispielsweise Shane's Rib Shack zu Shanes-Rib-Shack.

Folgendes habe ich bisher. Der Teil in Kleinbuchstaben war einfach, aber das Ersetzen scheint überhaupt nicht zu funktionieren, und ich habe keine Ahnung, die Interpunktion zu entfernen:

$("#Restaurant_Name").keyup(function(){
    var Text = $(this).val();
    Text = Text.toLowerCase();
    Text = Text.replace('/\s/g','-');
    $("#Restaurant_Slug").val(Text);    
});
GSto
quelle
2
Nicht jQuery, aber schauen Sie in die Bibliotheken "Speakingurl" oder "Node-Slug"
Kevin Wheeler
... oder slugify
x-yuri

Antworten:

379

Ich habe keine Ahnung, woher der Begriff "Schnecke" stammt, aber jetzt geht es los:

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

Das erste Ersetzen ändert Leerzeichen in Bindestriche, das zweite Ersetzen entfernt alles, was nicht alphanumerisch, unterstrichen oder getrennt ist.

Wenn Sie nicht möchten, dass Dinge wie "dieses" zu "wie --- das" werden, können Sie stattdessen dieses verwenden:

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

Dadurch werden beim ersten Ersetzen Bindestriche (aber keine Leerzeichen) entfernt, und beim zweiten Ersetzen werden aufeinanderfolgende Leerzeichen zu einem einzigen Bindestrich zusammengefasst.

Also "wie - das" kommt als "wie-das" heraus.

Peter Boughton
quelle
1
Vergessen Sie nicht, auch "/" hinzuzufügen, wenn Sie mehrere separate Verzeichnisse benötigen
Val
6
Der Begriff "Schnecke" stammt von WordPress
Brynner Ferreira
18
Um mehrere aufeinanderfolgende Bindestriche zu vermeiden, habe ich text.toLowerCase().replace(/ /g,'-').replace(/[-]+/g, '-').replace(/[^\w-]+/g,'');anstelle von Option 2 verwendet. Option 2 ändert "th - is" in "this".
Ryan Allen
Wie erlaube ich auch Punkte in der URL?
Idan Shechter
Um "_" in der Schnecke zu vermeiden, überschreiben Sie .replace (/ + / g, '-') durch .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;
};

und versuche

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

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


BEARBEITEN: erweitert für sprachspezifischere Zeichen:

var from = "ÁÄÂÀÃÅČÇĆĎÉĚËÈÊẼĔȆĞÍÌÎÏİŇÑÓÖÒÔÕØŘŔŠŞŤÚŮÜÙÛÝŸŽáäâàãåčçćďéěëèêẽĕȇğíìîïıňñóöòôõøðřŕšşťúůüùûýÿžþÞĐđßÆa·/_,:;";
var to   = "AAAAAACCCDEEEEEEEEGIIIIINNOOOOOORRSSTUUUUUYYZaaaaaacccdeeeeeeeegiiiiinnooooooorrsstuuuuuyyzbBDdBAa------";
Taranttini
quelle
6
Aber nicht richtig. In deutschen Texten üsollte durch ueusw. ersetzt werden
feklee
5
@feklee: "Nicht richtig" gilt für Deutsch (und möglicherweise einige andere Sprachen), aber in anderen Sprachen ist es in Ordnung. Für eine englische Website möchte ich, dass "Márföldi" (Nachname ungarischen Ursprungs) in "marfoldi" und nicht wie die Deutschen in "marfoeldi" umgewandelt wird.
Michalstanko
1
Um die plattformübergreifende Kompatibilität sicherzustellen, möchten Sie möglicherweise von = "\ u00E3 \ u00E0 \ u00E1 \ u00E4 \ u00E2 \ u1EBD \ u00E8 \ u00E9 \ u00EB \ u00EA \ u00EC \ u00ED \ u00EF \ u00EE \ u00F5 \ u00F2 \ u00E u00F6 \ u00F4 \ u00F9 \ u00FA \ u00FC \ u00FB \ u00F1 \ u00E7 \ u00B7 / _,:; ";
Mike Godin
1
Schöne Lösung! Ich vermisse den Skandinavier å.
Fredric
1
Sie können hinzufügen , İĞŞığşum fromvariable und wandeln sie in IGSigstürkischen Zeichen zu unterstützen.
CemilF
19

Zuallererst sollten reguläre Ausdrücke keine umgebenden Anführungszeichen haben, also sollte '/ \ s / g' sein / \ s / g

Um alle nicht alphanumerischen Zeichen durch Bindestriche zu ersetzen, sollte dies funktionieren (unter Verwendung Ihres Beispielcodes):

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

Das sollte den Trick machen ...

Philippe Leybaert
quelle
8

Ich habe eine gute und vollständige Lösung für Englisch gefunden

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

Einige Beispiele dafür:

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"

Vielen Dank an Andrew Stewart

zahid9i
quelle
8

Hoffe das kann jemandem den Tag retten ...

/* 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
quelle
7

Alles was du brauchst war ein 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
quelle
6

Schauen Sie sich diese Slug-Funktion an, um URLs zu bereinigen, die von Sean Murphy unter https://gist.github.com/sgmurphy/3095196 entwickelt wurden

/**
 * 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
quelle
1
In den Commets sagte jemand: "Dies funktioniert nicht mit strikter Verwendung in IE11-Browsern, da Duplikate im char_map-Objekt vorhanden sind."
BBaysinger
3

Ich erstelle ein Plugin, das in den meisten Sprachen implementiert werden kann: http://leocaseiro.com.br/jquery-plugin-string-to-slug/

Standardverwendung:

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

Ist sehr einfach hat stringToSlug jQuery Plugin

Leo Caseiro
quelle
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
}

* basierend auf https://gist.github.com/mathewbyrne/1280286

Jetzt können Sie diesen String transformieren:

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

in:

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

Anwendung auf Ihren Code:

$("#Restaurant_Name").keyup(function(){
    var Text = $(this).val();
    Text = slugify(Text);
    $("#Restaurant_Slug").val(Text);
});
Alexander Ivashchenko
quelle
Ich bin mir nicht sicher, warum dies nicht als richtige Antwort ausgewählt wurde. Viele der Antworten zählen nicht auf das Entfernen von # oder? von der Schnecke - URLs werden auf diese Weise beschädigt. Selbst in den am häufigsten verwendeten Reaktionsbibliotheken ist diese Funktion nicht implementiert. Diese Antwort ist sehr einfach und doch universell.
Vladimir Marton
3

Das Kombinieren einer Vielzahl von Elementen aus den Antworten hier mit Normalisieren bietet eine gute Abdeckung. Behalten Sie die Reihenfolge der Vorgänge bei, um die URL schrittweise zu bereinigen.

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')unterteilt akzentuierte Zeichen in ihre Bestandteile, bei denen es sich um Grundbuchstaben plus diakritische Zeichen (der Akzentteil) handelt. replace(/[\u0300-\u036f]/g, "")löscht alle Diakritika und lässt die Grundbuchstaben für sich. Der Rest wird mit Inline-Kommentaren erklärt.

SAUERSTOFF
quelle
1
Danke. Das ist einfach und funktioniert gut mit meinen Testfällen. Sogar das vietnamesische Zeichen `` `const testCases = [{input: 'is it a good slug', erwartet: 'is-it-a-good-slug'}, {input: '----- is --- --it ----- a ----- good ----- slug ----- ', erwarten:' is-it-a-good-slug '}, {input:' CÔNG cha như núi Thái Sơn ', erwarten:' cong-cha-nhu-nui-thai-son '}, {Eingabe:' -Haha - Nhất-Nguyễn ', erwarten:' haha-nhat-nguyen '}] ``
Phat Tran Ky
1

Sie können hierfür Ihre eigene Funktion verwenden.

Probieren Sie es aus: 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
quelle
Was ist der Unterschied zwischen dieser Lösung und der oben genannten Antwort?
Nilsi
Code hier aktualisiert, um das letzte Zeichen zu entfernen, wenn "-" jsfiddle.net/xstLr7aj/36
MGE
1

Die akzeptierte Antwort entsprach nicht meinen Anforderungen (sie erlaubt Unterstriche, behandelt keine Bindestriche am Anfang und Ende usw.), und die anderen Antworten hatten andere Probleme, die nicht zu meinem Anwendungsfall passten. Hier ist also die Slugify-Funktion Ich hatte die Idee dass:

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

Dies wird 'foo !!! BAR _-_-_ baz-' (beachten Sie das Leerzeichen am Anfang) in foo-bar-baz.

Justin Michael
quelle
1

Vielleicht möchten Sie sich das SpeakingURL-Plugin ansehen und dann können Sie einfach:

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

Noch einer. Kurz und hält Sonderzeichen:

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
quelle
1

Leistungsstärkere Slug-Generierungsmethode für reines JavaScript. Es unterstützt grundsätzlich die Transliteration für alle kyrillischen Zeichen und viele Umlaute (Deutsch, Dänisch, Frankreich, Türkisch, Ukrainisch usw.), kann jedoch problemlos erweitert werden.

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
quelle
1

Für Leute, die bereits verwenden lodash

Die meisten dieser Beispiele sind wirklich gut und decken viele Fälle ab. Aber wenn Sie wissen, dass Sie nur englischen Text haben, ist hier meine Version, die super einfach zu lesen ist :)

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

Frexuz
quelle
1

Nachdem ich die Antworten gelesen hatte, kam ich auf diese.

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

Hinweis: Wenn Sie sich nicht für ein Argument gegen die akzeptierte Antwort interessieren und nur nach einer Antwort suchen, überspringen Sie den nächsten Abschnitt. Meine vorgeschlagene Antwort finden Sie am Ende

Die akzeptierte Antwort hat einige Probleme (meiner Meinung nach):

1) wie für das erste Funktionsschnipsel:

Keine Rücksicht auf mehrere aufeinanderfolgende Leerzeichen

Eingang: is it a good slug

empfangen: ---is---it---a---good---slug---

erwartet: is-it-a-good-slug

Keine Rücksicht auf mehrere aufeinanderfolgende Striche

Eingang: -----is-----it-----a-----good-----slug-----

empfangen: -----is-----it-----a-----good-----slug-----

erwartet: is-it-a-good-slug

Bitte beachten Sie, dass diese Implementierung keine äußeren Bindestriche (oder Leerzeichen) behandelt, unabhängig davon, ob es sich um mehrere aufeinanderfolgende Striche oder einzelne Zeichen handelt, die (soweit ich Slugs und ihre Verwendung verstehe) nicht gültig sind

2) wie für das zweite Funktionsschnipsel:

Es kümmert sich um die mehreren aufeinanderfolgenden Leerzeichen, indem es sie in einzelne konvertiert. Dies reicht -jedoch nicht aus, da äußere Leerzeichen (am Anfang und Ende der Zeichenfolge) gleich behandelt werden und daher zurückkehren is it a good slugwürden-is-it-a-good-slug-

Außerdem werden Bindestriche vollständig aus der Eingabe entfernt, die so etwas wie --is--it--a--good--slug--'in konvertiertisitagoodslug durch das Snippet im Kommentar @ ryan-allen kümmert sich darum, die äußeren Striche ungelöst obwohl ausstellen lassen

Jetzt weiß ich, dass es keine Standarddefinition für Slugs gibt und die akzeptierte Antwort möglicherweise den Job erledigt (den der Benutzer, der die Frage gestellt hat, gesucht hat), aber dies ist die beliebteste SO-Frage zu Slugs in JS, also diese Probleme Ich musste auch darauf hinweisen, dass ich (in Bezug auf die Erledigung der Aufgabe! ) mir vorstellen kann, diesen Gräuel einer URL einzugeben ( www.blog.com/posts/-----how-----to-----slugify-----a-----string-----) oder einfach nur zu dieser umgeleitet zu werden, anstatt so etwas wie ( www.blog.com/posts/how-to-slugify-a-string). Ich weiß, dass dies ein extremer Fall ist, aber hey, das sind die Tests sind für.

Eine bessere Lösung wäre meiner Meinung nach wie folgt:

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

Jetzt gibt es wahrscheinlich einen RegExp-Ninja, der dies in einen Einzeiler-Ausdruck umwandeln kann. Ich bin kein Experte für RegExp und ich sage nicht, dass dies die beste oder kompakteste Lösung oder die mit der besten Leistung ist aber hoffentlich kann es die Arbeit erledigen.

Waddah
quelle
Dies hat einen Fehler, bei dem beim Konvertieren nicht alphanumerischer Zeichen in Bindestriche möglicherweise ein Bindestrich am Zeilenanfang wiederhergestellt wird. Aber bitte machen Sie es nicht zu einem Einzeiler. Dieser ist leicht zu verstehen!
Timo
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;
    };

Das hat mir bei dem gleichen Problem geholfen!

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

Dieser Code funktioniert

Deepak K. sah
quelle
0
function slugify(content) {
   return content.toLowerCase().replace(/ /g,'-').replace(/[^\w-]+/g,'');
}
// slugify('Hello World');
// this will return 'hello-world';

Das funktioniert gut für mich.

Fand es auf CodeSnipper

Al Quarashi
quelle
-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();
}

quelle