使用 ColdFusion 突出显示不区分大小写

Case insensitive highlighting with ColdFusion

正在尝试修复不区分大小写的关键字搜索结果突出显示。这是损坏的代码:

replaceNoCase(text, keyword, '<font style="background-color:yellow;">#keyword#</font>', 'all')

问题当然是文本中关键字的大小写被更改为用户输入的任何内容。

这是 PHP case insensitive highlighting in php 中的解决方案,但我不知道在使用 ColdFusion 的 REReplaceNoCase 函数时访问搜索文本中的匹配值的方法。关于如何解决这个问题的任何想法?

ColdFusion

replaceNoCase(text, keyword, '<span style="highlight">#keyword#</span>', 'all')

CSS

.highlight {
    background-color:yellow;
    text-transform: capitalize;
    }

首字母大写。

您可能想要

replaceNoCase(text, keyword, '<span style="highlight">#lcase(keyword)#</span>', 'all')

你试过这个吗?但它确实涉及一些布尔逻辑。

编辑:无效。

<cfset keyword = "batman">
<cfset text = "SOMETHING BATMAN SOMETHING.">
<cfoutput>
    #(FindNoCase(keyword, text))? ReplaceNoCase(text, keyword, '<font style="background-color:yellow;">' & Mid(text, FindNoCase(keyword, text), Len(keyword)) & '</font>', 'all') : text#
</cfoutput>

更像这样:

highlightedText = reReplaceNoCase(text, "(#keyword#)", '<span class="highlight"></span>', "ALL");

文档:REReplaceNoCase()

我在我的博客上从头开始相当彻底地研究了 CFML 的正则表达式系统:"Regular expressions in CFML" link summary

如您所说,reReplace 只会用用户输入的任何文本(大小写和全部)替换您的文本。这是我会做的:

  1. 使用竖线作为分隔符将文本转换为列表(因为 管道在普通文本中很少使用)
  2. 遍历列表中的每个项目
  3. 对列表项执行不区分大小写的搜索
  4. 如果列表项匹配,创建一个新变量 当前项目带有一个开始 span 标签,并附加一个 结束 span 标签(这会保留文本的当前大小写,而不是 而不是用搜索文本替换它)
  5. 将新变量保存在当前列表位置
  6. 循环完成后,将管道替换为空格

这是一个快速而粗略的要点。尝试一下,看看它是否适合你: https://gist.github.com/kriskorsmo/6d02e06bc4a8483b3341

这是我博客上的现场演示: kriskorsmo.com/examples/highlighting.cfm

我也在其中为您创建了一个简单的 "highlight" 函数。它有两个参数 - keyword 和 originalText - 以及 returns 突出显示关键字的原始文本。

******更好****** 在 CFLib.org - http://www.cflib.org/udf/Highlight

处有一个 UDF