突出显示搜索结果字符串案例问题

时间:2017-11-14 04:07:10

标签: javascript regex coldfusion highlight cfml

我正在使用带有字符串,搜索词和可选突出显示选项的cfscript,并返回突出显示搜索词的字符串:

<cfscript>
string function highlightKeywords(required string str, required string keywords, struct highlight){
    var keyword     = "";
    var replacement = "";

    param name="highlight.tag"          default="span";
    param name="highlight.attributes"   default="style='color:rgb(255,102,0);'";

    for (var index=1; index <= listLen( arguments.keywords, " " ); index++){
        keyword = ReReplace(listGetAt(arguments.keywords, index, " "), "\(|\)", "", "all" );
        replacement = "<#highlight.tag#";
        if (len(highlight.attributes)){
            replacement &= " #highlight.attributes#";
        }
        replacement &= ">" & keyword & "</#highlight.tag#>";

        arguments.str = reReplaceNoCase( arguments.str, "\b#keyword#\b", replacement, "all" );
    }
    return arguments.str;
}
</cfscript>

除了一个问题,一切似乎都运转良好。它改变了原始字符串的大小写。

例如,当用户搜索字词&#34; 突出显示搜索&#34;原始字符串存储为&#34;这是一个精彩搜索测试&#34;。人们会期望它会返回&#34;这是精彩搜索测试&#34;。相反,它返回&#34;这是突出显示搜索测试&#34;。它用用户键入的内容替换了案例,而不是保留原始案例。有人可以帮助我吗?提前谢谢。

附加说明: CF对后向引用的工作方式不同。

1 个答案:

答案 0 :(得分:3)

您可以使用"\b(#keyword#)\b" 捕获关键字(请注意捕获括号)并替换为此组1值的\1反向引用,以实际替换为匹配的变体关键字。

使用

replacement &= ">\1</#highlight.tag#>"

然后

 arguments.str = reReplaceNoCase( arguments.str, "\b(#keyword#)\b", replacement, "all" )