用新文本替换花括号

时间:2014-07-14 05:21:21

标签: javascript regex

il8n = {
  'en-us':{
    hello:"Hello Everyone",
    goodbye:"See ya later",
    welcome:"Hello how are you?",
    design:"Kandi Designs"
   }  
 };
 function translate(){
   var userLang = navigator.language || navigator.userLanguage; 
   var body = document.body || document.getElementsByTagName('body')[0];
   var html = body.innerHTML;
   body.innerHTML = body.innerHTML.replace(/({T_(.*?)})/g, il8n[userLang.toLowerCase()][$1.replace(/{T_|},'').toLowerCase()]);
  }

 translate();

基本上我想做的就是摆脱{T_Hello}Hello Everyone,但是因为我在正则表达式上吮吸我的捕获组并使用$1我无法正确理解这一点。任何人都可以协助这一点吗?

3 个答案:

答案 0 :(得分:2)

你有正确的想法。但是,1美元不是您使用它的变量。将第二个参数更改为replace

function (match, $1) {
    return il8n[userLang.toLowerCase()][$1.toLowerCase()];
}

replace can take a function as an argument。然后,将正则表达式中的捕获组缩短为:

/{T_(.*?)}/g

这样可以在replace函数中省去一些不必要的字符串处理。在一个不相关的说明中,关于性能,您可能希望服务器基于il8n标头发送相应的Accept-Language对象,或者更好的是,插入本身而不是依赖于片状和慢速客户端 - 代码(使其可缓存)。

答案 1 :(得分:0)

根据您的il8n对象键,您可以检查T_后跟任何大写字母。

/T_([A-Z]+)/

您也可以为其添加小写字母或数字:

/T_([A-Za-z0-9]+)/

答案 2 :(得分:0)

这应该有效:

body.innerHTML = body.innerHTML.replace(
    /({T_(.*?)})/g, 
    function (s) { return il8n [userLang.toLowerCase()] [s.replace(/{T_|}/g,'').toLowerCase()]; } 
);

replace()的第二个参数可以是一个字符串或一个函数,它接受的参数与正则表达式中的() - groups一样多,在您的情况下是一个。

确实,如果你写

s.replace (/a/g, 'b')

然后,显然,replace()收到两个字符串。但是,如果你写

s.replace (/a/g, f(x))

然后再次,replace()收到两个字符串,第二个是从f(x)返回的字符串,所以如果f(x)返回'b',那么上面的两个表达式是等价的。由于f(x)replace()有机会看到它之前执行,因此它不能使用$1之类的特殊变量,因为在调用时它们没有被定义。

如果您希望代码由replace()执行,那么它应该是可执行代码:

replace (/a/g, function (x) { return ' [' + x + '] found! '; } )

这样在调用时,形成了函数对象,并且每次使用参数$ 1在replace内调用此函数(注意正则表达式中的全局修饰符g)。

请注意,只有在文本下方或调用onload()而不是文本上方时,您的代码才有效:

<body>
{T_hello} reader!
<script>
your code
</script>
<body>

有效,但

<body>
<script>
your code
</script>
{T_hello} reader!
<body>

没有,因为当它被执行时,<body>中仍然没有任何内容。最好的地方是<body onload='translate()'>

我还更正了代码中的拼写错误:s.replace(/{T_|}应为s.replace(/{T_|}/

您的代码中的另一个错误是:s.replace(/{T_|}/应为s.replace(/{T_|}/g,因为它应该进行两次替换,而不是一次。