Как преобразовать заголовок в URL-адрес в jQuery?
Я работаю над приложением в CodeIgniter, и я пытаюсь создать поле в форме, чтобы динамически генерировать URL-адрес. То, что я хотел бы сделать, это удалить пунктуацию, преобразовать ее в нижний регистр и заменить пробелы дефисом. Так, например, Шейн Риб-Шак станет шрамом-ребрами.
Вот что я до сих пор. Строка в нижнем регистре была простой, но замена, похоже, не работает вообще, и я понятия не имею, чтобы удалить знаки препинания:
$("#Restaurant_Name").keyup(function(){
var Text = $(this).val();
Text = Text.toLowerCase();
Text = Text.replace('/\s/g','-');
$("#Restaurant_Slug").val(Text);
});
Ответы
Ответ 1
Я понятия не имею, откуда взялся термин 'slug', но здесь мы идем:
function convertToSlug(Text)
{
return Text
.toLowerCase()
.replace(/ /g,'-')
.replace(/[^\w-]+/g,'')
;
}
Первая замена изменяет пробелы на дефисы, вторая - удаляет что-либо не буквенно-цифровое, подчеркивание или дефис.
Если вы не хотите, чтобы вещи "вроде - это" превращались в "как --- это", вы можете вместо этого использовать это:
function convertToSlug(Text)
{
return Text
.toLowerCase()
.replace(/[^\w ]+/g,'')
.replace(/ +/g,'-')
;
}
Это приведет к удалению дефисов (но не пробелов) при первой замене, а во второй заменяющей его будет сжатие последовательных пробелов в один дефис.
Итак, "как - это" выходит как "как-это".
Ответ 2
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;
};
и попробовать
slug($('#field').val())
оригинал: http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/
РЕДАКТИРОВАТЬ: расширен для более конкретных языков символов:
var from = "ÁÄÂÀÃÅČÇĆĎÉĚËÈÊẼĔȆĞÍÌÎÏİŇÑÓÖÒÔÕØŘŔŠŞŤÚŮÜÙÛÝŸŽáäâàãåčçćďéěëèêẽĕȇğíìîïıňñóöòôõøðřŕšşťúůüùûýÿžþÞĐđ߯a·/_,:;";
var to = "AAAAAACCCDEEEEEEEEGIIIIINNOOOOOORRSSTUUUUUYYZaaaaaacccdeeeeeeeegiiiiinnooooooorrsstuuuuuyyzbBDdBAa------";
Ответ 3
Прежде всего, регулярные выражения не должны иметь окружающих кавычек, поэтому '/\ s/g' должен быть /\ s/g
Чтобы заменить все символы, отличные от буквенных символов, тире, это должно работать (используя код примера):
$("#Restaurant_Name").keyup(function(){
var Text = $(this).val();
Text = Text.toLowerCase();
Text = Text.replace(/[^a-zA-Z0-9]+/g,'-');
$("#Restaurant_Slug").val(Text);
});
Это должно сделать трюк...
Ответ 4
Все, что вам было нужно, было плюсом:)
$("#Restaurant_Name").keyup(function(){
var Text = $(this).val();
Text = Text.toLowerCase();
var regExp = /\s+/g;
Text = Text.replace(regExp,'-');
$("#Restaurant_Slug").val(Text);
});
Ответ 5
Надеюсь, это может спасти кого-то день...
/* Encode string to slug */
function convertToSlug( str ) {
//replace all special characters | symbols with a space
str = str.replace(/['[email protected]#$%^&*()_\-+=\[\]{};:'"\\|\/,.<>?\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>
Ответ 6
Взгляните на эту функцию slug, чтобы дезинфицировать URL-адреса, разработанные 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;
}
Ответ 7
Я нашел хорошее и полное решение для английского языка
function slugify(string) {
return string
.toString()
.trim()
.toLowerCase()
.replace(/\s+/g, "-")
.replace(/[^\w\-]+/g, "")
.replace(/\-\-+/g, "-")
.replace(/^-+/, "")
.replace(/-+$/, "");
}
Некоторые примеры использования:
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"
Благодаря Эндрю Стюарту
Ответ 8
Я создаю плагин для реализации на большинстве языков: http://leocaseiro.com.br/jquery-plugin-string-to-slug/
Использование по умолчанию:
$(document).ready( function() {
$("#string").stringToSlug();
});
Очень легко подключить плагин stringToSlug jQuery
Ответ 9
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
}
* на основе https://gist.github.com/mathewbyrne/1280286
теперь вы можете преобразовать эту строку:
Barack_Obama Барак_Обама [email protected]#$%^&*()+/-+?><:";'{}[]\|`
в
barack_obama-барак_обама
применительно к вашему коду:
$("#Restaurant_Name").keyup(function(){
var Text = $(this).val();
Text = slugify(Text);
$("#Restaurant_Slug").val(Text);
});
Ответ 10
Вы можете использовать свою собственную функцию для этого.
попробуйте: 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;
});
});
Ответ 11
Принятый ответ не соответствовал моим потребностям (он позволяет подчеркивать, не обрабатывать тире в начале и конце и т.д.), а в других ответах были другие проблемы, которые не устраивали мой прецедент, так что здесь функция slugify, с которой я столкнулся:
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.
}
Это превратит 'foo!!! BAR _-_-_ baz-' (обратите внимание на пробел в начале) на foo-bar-baz
.
Ответ 12
Вы можете взглянуть на плагин talkURL, а затем вы могли бы:
$("#Restaurant_Name").on("keyup", function () {
var slug = getSlug($("#Restaurant_Name").val());
$("#Restaurant_Slug").val(slug);
});
Ответ 13
Еще один. Короткие и сохраняются специальные символы:
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
}
Ответ 14
Более мощный метод генерации slug на чистом JavaScript. Он в основном поддерживает транслитерацию для всех кириллических персонажей и многих Umlauts (немецкий, датский, французский, турецкий, украинский и т.д.), Но может быть легко расширен.
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>
Ответ 15
Для людей, которые уже используют lodash
Большинство из этих примеров действительно хороши и охватывают множество случаев. Но если вы "знаете", что у вас есть только текст на английском языке, вот моя версия, которую супер легко читать :)
_.words(_.toLower(text)).join('-')
Ответ 16
Сочетание различных элементов из ответов здесь с нормализацией обеспечивает хороший охват. Сохраняйте порядок операций для постепенной очистки 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')
разбивает акцентированные символы на их компоненты, которые являются основными буквами плюс диакритические знаки (акцентная часть). replace(/[\u0300-\u036f]/g, "")
удаляет все диакритические знаки, оставляя основные буквы сами по себе. Остальное объясняется встроенными комментариями.
Ответ 17
Ну, после прочтения ответов, я придумал этот.
const generateSlug = (text) => text.toLowerCase().trim().replace(/[^\w- ]+/g, '').replace(/ /g, '-').replace(/[-]+/g, '-');
Ответ 18
//
// 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;
};
Это помогло мне с той же проблемой!
Ответ 19
Примечание. Если вас не интересует аргумент против принятого ответа, и вы просто ищете ответ, пропустите следующий раздел, и в конце вы найдете предложенный мной ответ
.В принятом ответе есть несколько вопросов (на мой взгляд):
1) как для первого фрагмента функции:
не обращая внимания на несколько последовательных пробелов
вход: is it a good slug
получил: ---is---it---a---good---slug---
ожидается: is-it-a-good-slug
не обращая внимания на несколько последовательных тире
вход: -----is-----it-----a-----good-----slug-----
получил: -----is-----it-----a-----good-----slug-----
ожидается: is-it-a-good-slug
обратите внимание, что эта реализация не обрабатывает внешние тире (или пробельные символы в этом отношении), являются ли они множественными последовательными или единичными символами, которые (насколько я понимаю слагы и их использование) недопустимы
2) что касается второго фрагмента функции:
он заботится о нескольких последовательных пробелах, преобразовывая их в один -
, но этого недостаточно, поскольку внешние (в начале и конце строки) пробелы обрабатываются одинаково, поэтому is it a good slug
вернет -is-it-a-good-slug-
он также полностью удаляет дефисы из входных данных, которые преобразуют что-то вроде --is--it--a--good--slug--'
в isitagoodslug
, об этом заботится фрагмент в комментарии @ryan-allen, оставляя проблему с внешними дефисами нерешенной, хотя
теперь я знаю, что нет стандартного определения для слагов, и принятый ответ может выполнить задание (которое искал пользователь, разместивший вопрос), но это самый популярный вопрос SO о слизняках в JS, поэтому эти проблемы Нужно было указать, также (в отношении выполнения работы!) представьте, что вы печатаете эту мерзость URL (www.blog.com/posts/-----how-----to-----slugify-----a-----string-----
) или даже просто перенаправляетесь на нее вместо чего-то вроде (www.blog.com/posts/how-to-slugify-a-string
), я знаю, что это крайне дело, но эй, для чего нужны тесты.
лучшее решение, на мой взгляд, было бы следующим:
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
Ответ 20
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();
}