好吧,我在聊天室网站工作......我遇到了这个问题......出于某种原因,三元运营商没有给我正确的输出......
执行工作的代码代码......
html = html.replace(/(@[a-zA-Z0-9]{1,})/, "<span class='" + (myUsername == "$1".replace('@', '') ? "highlighted-username" : "") + "'>$1</span>");
让我们说我的名字是&#34; jimisdam&#34;有人在聊天中写道&#34; @ jimisdam&#34; ...所以...我得到1美元并删除&#39; @&#39;将它与myUsername(&#34; jimisdam&#34;)
进行比较什么&#39;错了?
答案 0 :(得分:3)
JS不知道您希望在替换之前将$ 1替换为$ 1。它看到对html.replace
的方法调用,它接受2个参数:
要计算第二个参数,它会计算此表达式:
"<span class='" + (myUsername == "$1".replace('@', '') ? "highlighted-username" : "") + "'>$1</span>"
请注意,$1
并不意味着这里有什么特别之处,因为我们仍在决定将什么字符串传递给替换函数。所以:
"$1".replace('@', '')
只会产生"$1"
"<span class=''>$1</span>"
现在只有replace
才能看到$ 1的剩余实例并替换为捕获的值。
实现您要做的事情的一种方法是pass in a function rather than a string as the second parameter。这样,您可以将匹配的字符串部分作为变量,并可以使用它们来计算替换。
未经测试的例子,因为我正在打电话:
html = html.replace(/(@[a-zA-Z0-9]{1,})/, function(match) { return "<span class='" + (myUsername == match.replace('@', '') ? "highlighted-username" : "") + "'>" + match + "</span>"; })
答案 1 :(得分:0)
您的“$ 1”字符串文字不包含子匹配。那是错的。
但是,replace()
方法也将函数作为第二个参数。试试这个:
html = html.replace(/(@[a-zA-Z0-9]{1,})/,function(){
return '<span class="' +
(myUsername == arguments[0].replace('@','') ? 'highlighted-username' : '')
+ '">' + arguments[0] + '</span>';
});