Сбежать с помощью \-
должно быть хорошо, но вы также можете попробовать поставить его в начале или в конце класса символов. Это должно работать для вас:
/^[a-zA-Z0-9._-]+$/
Понятия не имею, откуда взялся термин 'slug', но начнем:
function convertToSlug(Text)
{
return Text
.toLowerCase()
.replace(/ /g,'-')
.replace(/[^\w-]+/g,'')
;
}
Первая замена заменит пробелы на дефис, вторая замена удалит все, кроме буквенно-цифровых символов, подчеркиваний или дефисов. .
Если вы не хотите, чтобы что-то типа "вроде - это" превратилось в "подобное - это", вы можете вместо этого использовать это:
function convertToSlug(Text)
{
return Text
.toLowerCase()
.replace(/[^\w ]+/g,'')
.replace(/ +/g,'-')
;
}
Это удалит дефисы (но не пробелы) при первой замене, а во второй замене он объединит последовательные пробелы в один дефис.
Итак, «подобное - это» получается как «подобное - это».
Примечание: если Вы не будете заботиться об аргументе против принятого ответа и будете просто искать ответ, то пропустите следующий раздел, то Вы найдете мой предложенный ответ в конце
, принятый ответ имеет несколько проблем (по-моему):
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-
, это также удаляет тире в целом из входа, который преобразовывает что-то как [1 110] к [1 111], отрывок в комментарии @ryan-allen заботится об этом, оставляя внешнюю проблему тире нерешенной, хотя
теперь я знаю, что нет никакого стандартного определения для кратких заголовков, и принятый ответ может получить задание (который пользователь, который отправил вопрос, искал), сделанный, но это является самым популярным ТАК вопрос о кратких заголовках в JS, таким образом, на те проблемы нужно было указать, также (относительно [1 117] получение сделанного задания! ), предполагают вводить это отвращение URL (www.blog.com/posts/-----how-----to-----slugify-----a-----string-----
) или даже просто перенаправляться к нему вместо чего-то как ([1 113]), я знаю, что это - крайний случай, но эй это - то, для чего тесты.
лучшее решение , по-моему, было бы следующие:
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
теперь существует, вероятно, ниндзя RegExp там, который может преобразовать это в выражение остроты, я не эксперт в RegExp, и я не говорю, что это - лучшее или самое компактное решение или то с лучшей производительностью, но надо надеяться это могло сделать задание.
Прежде всего, регулярные выражения не должны иметь окружающих кавычек, поэтому '/ \ 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);
});
Это должно помочь ...
Все, что вам нужно, это плюс :)
$("#Restaurant_Name").keyup(function(){
var Text = $(this).val();
Text = Text.toLowerCase();
var regExp = /\s+/g;
Text = Text.replace(regExp,'-');
$("#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();
}
Я создаю подключаемый модуль для реализации на большинстве языков: http://leocaseiro.com.br/jquery-plugin-string-to-slug/
Использование по умолчанию:
$(document).ready( function() {
$("#string").stringToSlug();
});
Очень просто, есть StringToSlug jQuery Plugin