我正在尝试实现"智能搜索"功能,当用户键入关键字时,该功能会突出显示div中的文本匹配.突出显示的工作原理是使用正则表达式匹配div中的关键字并将其替换为
<span class="highlight">keyword</span>
Run Code Online (Sandbox Code Playgroud)
该应用程序支持英语和阿拉伯语文本.英语工作得很好,但是当突出显示阿拉伯语时,单词"打破"跨度上的单词连接而不是保持单个连续单词.
我试图通过使用3个单独的Regex表达式并适当地为每种情况添加零宽度连接来解决问题:
在一个单词的开头匹配
var startsWithRegex = new RegExp("((^|\\s)" + keyword + ")", "gi");
var newSpan = "<span class='highlight'>$1‍</span>‍";
在一个单词的中间匹配(注意:单个单词中可以有多个middleOf匹配)
var middleOfRegex = new RegExp("([^(^|\\s)])(" + keyword + ")([^($|\\s)])", "gi");
var newSpan = "‍$1‍<span class='highlight'>‍$2‍</span>‍$3‍";
匹配一个单词的结尾
var endsWithRegex = new RegExp("(" + keyword + "($|\\s))", "gi");
var newSpan = "‍<span class='highlight'>‍$1</span>";
startsWithRegex和endsWithRegex似乎都按预期工作,但是middleOfRegex不是.例如:
للأبد
转换为:
للأبد
当关键字是:
ل
我尝试了其他各种组合,‍但似乎没有任何工作.这是webkit的限制吗?我可以使用另一种实现来获得我想要的结果吗?
谢谢!
一些额外的说明:
这个问题是对这两个stackoverflow问题的扩展: