Javascript 用新文本替换大括号
基本上,我想做的是摆脱Javascript 用新文本替换大括号,javascript,regex,Javascript,Regex,基本上,我想做的是摆脱{T_Hello}到大家好,但由于我在正则表达式中很烂,我的捕获组使用$1我无法正确地得到它。有人能帮点忙吗?根据您的il8n对象键,您可以这样做以检查是否有T\uUcode>后跟任何大写字母 /T([A-Z]+)/ 您也可以添加小写或数字: 你的想法是对的$但是,1在使用时不是一个变量。将第二个参数更改为replace,如下所示: il8n = { 'en-us':{ hello:"Hello Everyone", goodbye:"See ya la
{T_Hello}
到大家好
,但由于我在正则表达式中很烂,我的捕获组使用$1
我无法正确地得到它。有人能帮点忙吗?根据您的il8n对象键,您可以这样做以检查是否有T\uUcode>后跟任何大写字母
/T([A-Z]+)/
您也可以添加小写或数字:
你的想法是对的$但是,1在使用时不是一个变量。将第二个参数更改为replace
,如下所示:
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();
。然后,将正则表达式中的捕获组缩短为:
function (match, $1) {
return il8n[userLang.toLowerCase()][$1.toLowerCase()];
}
这样可以在replace函数中节省一些不必要的字符串处理。另一方面,关于性能,您可能希望服务器基于接受语言
头发送适当的il8n
对象,或者,更好的是,自己进行插入,而不是依赖于脆弱而缓慢的客户端代码(使其可缓存)。这应该可以:
/{T_(.*?)}/g
replace()
的第二个参数可以是一个字符串或一个函数,它接受的参数数量与正则表达式中的()组相同,在您的例子中,这是一个
的确,如果你写信
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()
再次接收两个字符串,第二个是从f(x)
返回的字符串,因此如果f(x)
返回'b'
,则上述两个表达式是等效的。由于f(x)
是在replace()
有机会看到它之前执行的,因此它不能使用像$1
这样的特殊变量,因为在调用时它们没有定义
如果希望代码由replace()
执行,那么它应该是可执行代码:
s.replace (/a/g, f(x))
因此,在调用点,函数对象被形成,并且每次都在replace
内部调用该函数,参数为$1(注意正则表达式中的全局修饰符g)
请注意,只有将代码放在文本下方或调用onload()时,代码才会工作,而不是放在文本上方:
replace (/a/g, function (x) { return ' [' + x + '] found! '; } )
{你好}读者!
你的代码
有效,但是
<body>
{T_hello} reader!
<script>
your code
</script>
<body>
你的代码
{你好}读者!
不会,因为执行时,
中没有任何内容。调用它的最佳位置是
我还更正了代码中的一个输入错误:s.replace(/{T|}
应该是s.replace(/{T|}/
)
代码中的另一个错误是:s.replace(/{T|}/
应该是s.replace(/{T|}/g
,因为它应该进行两次替换,而不是一次。FYI,var body=document.body | document.getElementsByTagName('body')[0]
不需要第二部分作为文档。body
总是好的。而且,你没有使用html
变量。哈哈,是的,我刚刚意识到html
部分。我总是用body做这件事,只是作为预防措施。这是一个老习惯,不会完美无缺!我总是忘记它可以起作用:/
<body>
<script>
your code
</script>
{T_hello} reader!
<body>