【发布时间】:2018-04-26 21:53:27
【问题描述】:
我正在使用一个 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>
似乎一切正常,除了一个问题。它改变了原始字符串的大小写。
例如,当用户搜索“highlight search”一词时,原始字符串存储为“This is a Highlight Search Testing”。人们会期望它会返回“这是一个突出显示搜索测试”。相反,它返回“这是一个高亮搜索测试”。它用用户输入的任何内容替换了大小写,而不是保留原始大小写。有人可以帮助我吗?提前致谢。
补充说明: CF 对反向引用的工作方式不同。
【问题讨论】:
-
replacement &= ">" & keyword & "</#highlight.tag#>";=>replacement &= ">$&</#highlight.tag#>"; -
@WiktorStribiżew 我试过了,但它不起作用。突出显示的单词变成了'$&'。我得到了“这是 $& 测试”
-
@WiktorStribiżew 很抱歉,我不明白你的意思。您可以添加作为解决方案吗?
-
看起来 CF 正则表达式不支持
$nbackreference syntax,我不确定\0是否有效。因此,您需要包装关键字,然后在替换模式中使用\1反向引用。 -
尝试
replacement &= ">\1</#highlight.tag#>"然后reReplaceNoCase( arguments.str, "\b(#keyword#)\b", replacement, "all" )
标签: javascript regex coldfusion highlight cfml