9

我有一个文本框,用户在其中放置这样的字符串:

"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

4 回答 4

14

尝试这个:

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

至于希腊字符,是的,除了另一个正则表达式使用的某种查找表之外,我想不出其他任何东西。

Edit,这里是 oneliner 版本:
Edit,添加到LowerCase():
Edit,对尾部正则表达式进行了令人尴尬的修复:

function doDashes2(str) {
    return str.replace(/[^a-z0-9]+/gi, '-').replace(/^-*|-*$/g, '').toLowerCase();
}
于 2010-03-25T22:31:46.697 回答
1

完成这项工作的一个简单正则表达式是匹配所有“非单词”字符,并将它们替换为-. 但在匹配此正则表达式之前,将字符串转换为小写。仅此一项并不是万无一失的,因为最后可能会出现破折号。

[^a-z]+

因此,更换后;您可以使用此正则表达式修剪破折号(从前面和后面):

^-+|-+$

您必须自己创建希腊语到拉丁语的 glyps 翻译,正则表达式无法帮助您。使用翻译数组是个好主意。

于 2010-03-25T22:26:38.513 回答
1

我真的不能说希腊字符,但对于第一个例子,一个简单的:

/[^a-zA-Z]+/

将其用作您的模式时会起作用,并用“-”替换匹配项

根据希腊字符,我建议使用包含所有“字符翻译”的数组,然后将其值添加到正则表达式中。

于 2010-03-25T22:27:45.173 回答
1

要粗略地构建 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/, '-');

它只是删除所有非字母字符,删除双倍间距,然后用破折号替换所有空格字符。

您可以使用另一个正则表达式将希腊字符替换为英文字符。

于 2010-03-25T22:27:46.607 回答