JavaScript有效替换字符串中的所有重音字符?
对于穷人在客户端上实现近似排序规则正确排序的实现,我需要一个JavaScript函数,该函数可以 有效地 替换字符串中的单个字符。
这就是我的意思(请注意,这适用于德语文本,其他语言则有不同的排序方式):
本机排序弄错了:abcouzäöü正确的排序规则是:aäbcoöuüz
基本上,我需要将给定字符串的所有出现的“ä”替换为“ a”(依此类推)。这样,本机排序的结果将非常接近用户的期望(或数据库将返回的结果)。
其他语言也具有执行此操作的功能:Python提供str.translate()
,在Perl中tr/…/…/
,XPath具有功能translate()
,ColdFusion具有ReplaceList()
。但是JavaScript呢?
这就是我现在所拥有的。
// s would be a rather short string (something like // 200 characters at max, most of the time much less)
function makeSortString(s) {
var translate = {
"ä": "a", "ö": "o", "ü": "u",
"Ä": "A", "Ö": "O", "Ü": "U" // probably more to come
};
var translate_re = /[öäüÖÄÜ]/g;
return ( s.replace(translate_re, function(match) {
return translate[match];
}) );
}
对于初学者,我不喜欢每次调用该函数都会重新构建正则表达式的事实。我猜闭包可以在这方面有所帮助,但是由于某种原因,我似乎没有把握住它。
有人能想到更有效的方法吗?
回答:
我无法说出您要针对函数本身专门做什么,但是如果您不喜欢每次都构建正则表达式,则这里有两个解决方案,以及每个注意事项。
这是执行此操作的一种方法:
function makeSortString(s) { if(!makeSortString.translate_re) makeSortString.translate_re = /[öäüÖÄÜ]/g;
var translate = {
"ä": "a", "ö": "o", "ü": "u",
"Ä": "A", "Ö": "O", "Ü": "U" // probably more to come
};
return ( s.replace(makeSortString.translate_re, function(match) {
return translate[match];
}) );
}
显然,这会使正则表达式成为函数本身的属性。您对此可能不喜欢的唯一事情(或者您可能会猜到这取决于情况)是,现在可以在函数主体外部修改正则表达式。因此,有人可以这样做来修改相互使用的正则表达式:
makeSortString.translate_re = /[a-z]/g;
因此,有一个选择。
一种获得闭包(从而防止某人修改正则表达式)的方法是将其定义为匿名函数分配,如下所示:
var makeSortString = (function() { var translate_re = /[öäüÖÄÜ]/g;
return function(s) {
var translate = {
"ä": "a", "ö": "o", "ü": "u",
"Ä": "A", "Ö": "O", "Ü": "U" // probably more to come
};
return ( s.replace(translate_re, function(match) {
return translate[match];
}) );
}
})();
希望这对您有用。
更新:还很早,我不知道为什么以前看不到明显的东西,但是将translate
对象也放在闭包中也可能很有用:
var makeSortString = (function() { var translate_re = /[öäüÖÄÜ]/g;
var translate = {
"ä": "a", "ö": "o", "ü": "u",
"Ä": "A", "Ö": "O", "Ü": "U" // probably more to come
};
return function(s) {
return ( s.replace(translate_re, function(match) {
return translate[match];
}) );
}
})();
以上是 JavaScript有效替换字符串中的所有重音字符? 的全部内容, 来源链接: utcz.com/qa/403082.html