为什么三元运算符不能正常工作?

时间:2015-07-17 22:27:08

标签: javascript html replace ternary-operator

好吧,我在聊天室网站工作......我遇到了这个问题......出于某种原因,三元运营商没有给我正确的输出......

执行工作的代码代码......

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;错了?

2 个答案:

答案 0 :(得分:3)

JS不知道您希望在替换之前将$ 1替换为$ 1。它看到对html.replace的方法调用,它接受2个参数:

  • 匹配的正则表达式
  • 要替换为
  • 的字符串

要计算第二个参数,它会计算此表达式:

"<span class='" + (myUsername == "$1".replace('@', '') ? "highlighted-username" : "") + "'>$1</span>"

请注意,$1并不意味着这里有什么特别之处,因为我们仍在决定将什么字符串传递给替换函数。所以:

  • "$1".replace('@', '')只会产生"$1"
  • 因此,除非您的用户名恰好为$ 1,否则比较将始终为false
  • 所以空字符串将添加到类属性
  • 所以传递的参数将始终为"<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>';
});