【发布时间】:2012-05-02 15:16:51
【问题描述】:
我正在编写一个 jquery 插件,它将执行浏览器样式的页面查找搜索。我需要改进搜索,但还不想完全解析 html。
目前我的方法是获取整个 DOM 元素和所有嵌套元素,然后简单地为给定术语运行正则表达式查找/替换。在替换中,我将简单地在匹配的术语周围包裹一个跨度,并将该跨度用作我的锚点来进行突出显示、滚动等。任何 html 标记中的字符都不能匹配,这一点至关重要。 p>
这是我得到的最接近的:
(?<=^|>)([^><].*?)(?=<|$)
它很好地捕获了 html 标记中 非 的所有字符,但我无法弄清楚如何插入我的搜索词。
Input: Any html element (this could be quite large, eg <body>)
Search Term: 1 or more characters
Replace Txt: <span class='highlight'>$1</span>
更新
当我使用http://gskinner.com/RegExr/ 进行测试时,以下正则表达式可以满足我的需求...
Regex: (?<=^|>)(.*?)(SEARCH_STRING)(?=.*?<|$)
Replacement: $1<span class='highlight'>$2</span>
但是我在我的 javascript 中使用它时遇到了一些问题。使用以下代码,chrome 给我错误“无效的正则表达式:/(?)(.?)(Mary)(?=.?
var origText = $('#'+opt.targetElements).data('origText');
var regx = new RegExp("(?<=^|>)(.*?)(" + $this.val() + ")(?=.*?<|$)", 'gi');
$('#'+opt.targetElements).each(function() {
var text = origText.replace(regx, '$1<span class="' + opt.resultClass + '">$2</span>');
$(this).html(text);
});
它在组中中断 (?) - 这是笨拙的东西还是正则表达式引擎的差异?
更新
这个正则表达式在该组中中断的原因是因为 Javascript 不支持正则表达式后视。供参考和可能的解决方案:http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript。
【问题讨论】:
-
sigh 请不要使用 RegEx 解析 HTML,因为它会 drive you insane。请改用HTML parser。
-
我有一个转向 html 解析的计划,但我需要一个快速的概念验证才能获得批准。
-
你应该把它作为你的概念证明,而不是 RegExp。这是一个已解决的问题,请不要过度使用 RegExp。
-
@Truth:感谢您的关注。请停止。我同意你的说法并接受你明显的议程。我的问题是,如何在这个正则表达式字符串中插入搜索词?
-
看看mark.js,因为它可能是您正在寻找的东西。