jQuery替换$sign会在字符串末尾添加$sign



因此,我的总体项目是通过PHP的imap从AJAX调用中获取电子邮件。这就完成了。我有所有的电子邮件,它们是分开的。

我现在正在浏览每封电子邮件,并通过用<b>word</b>替换单词来"突出显示"某些单词。这基本上是有效的。我很想用美元符号来做这件事,但它造成了一个非常奇怪的问题。

假设我有一封电子邮件,上面写着:

It will cost $500.  How's thursday sound?

我有一个数组,里面装满了我想"突出显示"的单词:

var keywords = [
    ....
    "Wednesday",
    "wednesday",
    "Thursday",
    "thursday",
    "Friday",
    "friday",
    ....
    ":",
    "$",
    "%",
    ....
]

(省略号显示在您看到的内容之前和之后有许多关键字)。

我用这个来替换每个单词并将其加粗:

function highlightImportant(that) {
    that.find('.email-container').each(function(){
        var full_text = $(this).text();
        $.each(keywords, function(i) {
            full_text = full_text.replace(new RegExp(keywords[i],"gi"), "<b>"+keywords[i]+"</b>");
        });
       $(this).html(full_text);
    });
} 

这适用于所有的单词和字符,但美元符号的行为非常奇怪。问题是,由于某种原因,当它运行时,它每次都会在电子邮件(字符串)的末尾添加一个美元符号,然后只将该美元符号加粗。。。。因此,对于每封电子邮件,它都会在末尾添加另一个美元符号:

It will cost $<b>5</b><b>0</b><b>0</b>.  How's <b>thursday</b> sound?<b>$</b>

注意到$500开头的美元符号没有加粗,而是在字符串末尾添加了一个美元符号?

看看这把小提琴,自己看看:http://jsfiddle.net/2L3vhtwh/1/

使用new RegExp("\"+keywords[i],"gi")以处理特殊字符。$是一个特殊的字符。

Fiddle

如果要将关键字扩展为包含正则表达式,则需要将转义添加到数组中的项,而不是直接添加到RegExp中。对于你目前拥有的内容,@void很准确,但如果你想进行更复杂的搜索,比如以"谁"、"什么"、"哪里"、"为什么"或"何时"开头的句子(例如,试图确定被解析的句子是否是一个问题),那么像"^Wh(o|at|ere|y|en)"这样的东西就会被过度转义,因为克拉对你来说意味着特殊的东西。

只是对未来设计考虑的一个提醒。

此外,根据您的代码,"gi"的意思是全局的,不区分大小写。使用"星期五"one_answers"星期五"会导致超出必要的循环,从而降低页面的性能。

最新更新