Создать постоянную ссылку с JavaScript - PullRequest
9 голосов
/ 26 марта 2010

У меня есть текстовое поле, где пользователь помещает строку, подобную этой:

"hello world! I think that __i__ am awesome (yes I am!)"

Мне нужно создать правильный URL, например:

hello-world-i-think-that-i-am-awesome-yes-i-am

Как это можно сделать с помощью регулярных выражений?

Кроме того, возможно ли сделать это с греческим (например)?

"Γεια σου κόσμε"

превращается в

geia-sou-kosme

В других языках программирования ( Python / Ruby ) Я использую массив перевода. Должен ли я сделать то же самое здесь?

Ответы [ 4 ]

13 голосов
/ 26 марта 2010

Попробуйте это:

function doDashes(str) {
    var re = /[^a-z0-9]+/gi; // global and case insensitive matching of non-char/non-numeric
    var re2 = /^-*|-*$/g;     // get rid of any leading/trailing dashes
    str = str.replace(re, '-');  // perform the 1st regexp
    return str.replace(re2, '').toLowerCase(); // ..aaand the second + return lowercased result
}
console.log(doDashes("hello world! I think that __i__ am awesome (yes I am!)"));
// => hello-world-I-think-that-i-am-awesome-yes-I-am

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

Редактировать , вот версия oneliner:
Редактировать , добавлено в LowCase ():
Редактировать , неловкое исправление в конце регулярного выражения:

function doDashes2(str) {
    return str.replace(/[^a-z0-9]+/gi, '-').replace(/^-*|-*$/g, '').toLowerCase();
}
1 голос
/ 26 марта 2010

Я не могу сказать, для греческого символов, но для первого примера, просто:

/[^a-zA-Z]+/

Сработает при использовании его в качестве шаблона и замене совпадений на "-"

Что касается греческих символов, я бы предложил использовать массив со всеми «переводами символов», а затем добавить его значения в регулярное выражение.

1 голос
/ 26 марта 2010

Чтобы примерно построить URL, вам нужно что-то вроде этого.

var textbox = "hello world! I think that __i__ am awesome (yes I am!)";
var url = textbox.toLowerCase().replace(/([^a-z])/, '').replace(/\s+/, " ").replace(/\s/, '-');

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

Вы можете использовать другое регулярное выражение для замены греческих букв английскими.

1 голос
/ 26 марта 2010

Простое регулярное выражение для выполнения этой работы - сопоставление всех не-словесных символов и замена их на -.Но прежде чем сопоставить это регулярное выражение, преобразуйте строку в нижний регистр.Это само по себе не является доказательством дурака, так как возможен штрих на конце.

[^a-z]+

Таким образом, после замены;Вы можете обрезать тире (спереди и сзади) с помощью этого регулярного выражения:

^-+|-+$

Вам нужно было бы самостоятельно создать перевод с греческого на латинский, регулярное выражение не может вам помочь.Использование массива перевода - хорошая идея.

...