Как преобразовать заголовок в URL-слаг в JQuery?

Сбежать с помощью \- должно быть хорошо, но вы также можете попробовать поставить его в начале или в конце класса символов. Это должно работать для вас:

/^[a-zA-Z0-9._-]+$/
146
задан auntialias 6 August 2013 в 23:59
поделиться

6 ответов

Понятия не имею, откуда взялся термин 'slug', но начнем:

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

Первая замена заменит пробелы на дефис, вторая замена удалит все, кроме буквенно-цифровых символов, подчеркиваний или дефисов. .

Если вы не хотите, чтобы что-то типа "вроде - это" превратилось в "подобное - это", вы можете вместо этого использовать это:

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

Это удалит дефисы (но не пробелы) при первой замене, а во второй замене он объединит последовательные пробелы в один дефис.

Итак, «подобное - это» получается как «подобное - это».

346
ответ дан 23 November 2019 в 22:02
поделиться

Примечание: если Вы не будете заботиться об аргументе против принятого ответа и будете просто искать ответ, то пропустите следующий раздел, то Вы найдете мой предложенный ответ в конце

, принятый ответ имеет несколько проблем (по-моему):

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, и я не говорю, что это - лучшее или самое компактное решение или то с лучшей производительностью, но надо надеяться это могло сделать задание.

0
ответ дан 23 November 2019 в 22:02
поделиться

Прежде всего, регулярные выражения не должны иметь окружающих кавычек, поэтому '/ \ 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);        
});

Это должно помочь ...

18
ответ дан 23 November 2019 в 22:02
поделиться

Все, что вам нужно, это плюс :)

$("#Restaurant_Name").keyup(function(){
        var Text = $(this).val();
        Text = Text.toLowerCase();
        var regExp = /\s+/g;
        Text = Text.replace(regExp,'-');
        $("#Restaurant_Slug").val(Text);        
});
7
ответ дан 23 November 2019 в 22:02
поделиться
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();
}
-5
ответ дан 23 November 2019 в 22:02
поделиться

Я создаю подключаемый модуль для реализации на большинстве языков: http://leocaseiro.com.br/jquery-plugin-string-to-slug/

Использование по умолчанию:

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

Очень просто, есть StringToSlug jQuery Plugin

3
ответ дан 23 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: