2

我正在尝试构建一个小型 Javascript 应用程序,该应用程序加载第三方站点,查找给定单词并使用 Jquery 扩展Highlight 突出显示文档的最接近上下文(具有允许正则表达式的小自定义)。

首先,我试图通过将上下文设置为 500 个字符来让应用程序突出显示周围环境,但由于某种原因,它在奇怪的地方被切断了。对于这篇文章,我试图匹配术语Obama,正如你从我的截图中看到的那样,它在不应该出现的地方被切断了。

有没有人知道发生了什么?

$(document).ready(function() {
    $.get(getUrlVars()["url"],
    function(data) {
        var fdata = $(data);
        var associationScope= 500;


        $.each(getUrlVars()["topics"].split(","), function(index, value) {
            if (getUrlVars()["associationScope"] == "context") {
                var associationScopeRegex = "((?!</span>)[\\s\\S]{0," + associationScope + "})" 
                    + value + "((?!<span class=\"associationScope\">)[\\s\\S]{0," + associationScope + "})";

                fdata.highlight(associationScopeRegex, {className: "associationScope"});
            }

            fdata.highlight(value, {className: "topicHighlight"});
        });

        $("#externalPage").html(fdata);

    });
});

高亮结果截图

4

1 回答 1

2

当您通过字符串构建时,您需要转义一些正则表达式元字符(在您的情况下是反斜杠):

   var associationScopeRegex = "((?!</span>)(.|\\n|\\r|\\t){0," + associationScope + "})" 
       + value + "((?!<span class=\"associationScope\">)(.|\\n|\\r|\\t){0," + associationScope + "})";

当您从字符串构建正则表达式时,您必须考虑到 JavaScript 解析器不知道您的字符串将成为正则表达式的事实;它只是将其解析为字符串。字符串常量的语法对某些特殊字符使用反斜杠,因此这些字符将被解释为字符串的一部分。

(您不必在双引号字符的反斜杠上加倍,因为可以将它们保留为正则表达式的简单双引号。)

于 2013-04-20T00:00:09.780 回答