使用javascript正则表达式翻译html

时间:2012-04-25 08:11:58

标签: javascript regex

我想在javascript中构建自己的翻译功能。 我已经有一个函数language.lookup(key)来翻译一个单词或表达式:

var frenchHello = language.lookup('hello') //'bonjour'

现在我想写一个函数,它接受一个html字符串并用我的查找函数进行翻译。在html字符串中,我将有一个特殊的语法,例如#[translationkey],它将指出该单词应该被翻译。

这是我想要的结果:

var html = '<div><span>#[hello]</span><span>#[sir]</span>'
language.translate(html) //'<div><span>bonjour</span><span>monsieur</span>

我怎么写language.translate? 我的想法是用regex过滤掉我的特殊语法,然后在每个键上运行language.lookup。也许用字符串替换或其他东西。

当涉及到正则表达式时,我很糟糕,我只提出了一个非常不完整的例子,但无论如何我都包括它,所以也许有人知道我想要做什么。然后,如果有一个更好但完全不同的解决方案,这是非常受欢迎的。

var value = "#[hello], nice to see you.";

lookup = function(word){
    return "bonjour";
};

var res = new RegExp( "\\b(hello)\\b", "gi" ).exec(value)

for (var c1 = 0; c1 < res.length; c1++){
    value = value.replace(res[c1], lookup(res[c1]))
}       
alert(value) //#[bonjour], nice to see you.

正则表达式当然不应过滤掉单词hello而是过滤掉语法,然后通过分组或类似方法收集密钥。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

只需使用String.replace方法调用指定为第二个参数的函数来生成替换文本,并使用符合语法的regexp进行全局替换:

var value = "#[hello], #[sir], nice to see you.";

lookup = function(full_match, word){
    if(word == 'hello')
        return "bonjour";
    if(word == 'sir')
        return "monsieur"
};

console.log(value.replace(/#\[(.+?)\]/gi, lookup))

结果: bonjour,先生,很高兴见到你。

当然,当您的替换列表变大时,您最好使用查找对象而不是查找功能中的一系列ifs,但您可以在那里做任何您想做的事。

答案 1 :(得分:1)

您可以使用以下内容:

#\\[[^\\]]*\\]

哪个匹配哈希后跟一个左方括号后跟零个或多个字符,不包括结束方括号,后跟一个封闭的方括号。

或者,也许最好在服务器端处理翻译(甚至可能通过模板引擎)并将已翻译的响应发送回客户端。否则,(取决于您当然要处理的具体问题),您最终可能会向浏览器发送大量数据,这可能会使您的应用程序响应缓慢。

编辑: 这是一段代码:

    var q="This #[ANIMAL1] was eaten by that #[ANIMAL2]";
    var u = {"#[ANIMAL1]":"Lion","#[ANIMAL2]":"Frog"};

    function insertAnimal(aString, lookup){
        var res = (new RegExp("#\\[[^\\]]*\\]", "gi"))          
        while (m = res.exec(aString)){
            aString = aString.replace(m, lookup[m])
        }       
        return aString;
    }  

    function main(){
        alert(insertAnimal(q,u));           
    }

您可以从HTML文档的body onload事件中调用“main()”

答案 2 :(得分:1)

您可以尝试此操作来查找所有事件:

var re = new RegExp('#\\[([^\\]]+?)\\]', 'gi'),
    str = '#[value1] plain text #[value2]',
    match;

while (match = re.exec(str)) {
    console.log(match);
}

答案 3 :(得分:0)

我可以将您的要求与在内容中解析模板文本进行比较。如果使用Jquery是可行的,你应该尝试Handlebars.js