用新文本替换花括号

replacing curley braces with new text

本文关键字:文本替换      更新时间:2023-09-26
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我不能正确地得到这一点。有人能帮帮忙吗?

你的想法是对的。然而,$1并不是一个变量。将replace的第二个参数更改为:

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

replace可以接受函数作为实参。然后,将正则表达式中的捕获组缩短为:

/{T_(.*?)}/g

这样可以在replace函数中节省一些不必要的字符串处理。关于性能,您可能希望服务器根据Accept-Language头发送适当的il8n对象,或者更好的是,自己执行插入,而不是依赖于脆弱和缓慢的客户端代码(使其可缓存)。

根据您的il8n对象键,您可以这样做来检查T_后面是否有大写字母。

/T_([A-Z]+)/

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

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

应该可以:

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

replace()的第二个参数可以是一个字符串或一个函数,它可以接受很多参数,就像正则表达式中有()组一样,在你的例子中是一个。

事实上,如果你写

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! '; } )

以便在调用时,形成函数对象,并且每次在replace内部以参数$1调用该函数(注意正则表达式中的全局修饰符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,因为它应该做两个替换,而不是一个。