Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用新文本替换大括号_Javascript_Regex - Fatal编程技术网

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>