【发布时间】:2011-11-08 16:04:14
【问题描述】:
好的,我已经用下面的答案和 cmets 的改进代码更新了这个问题,并且更类似于实际项目。但它仍然不能在 IE8 中工作。 fiddle here
<ul id="definitions">
<li id="defid63">keyword1<input type="hidden" value="63" /></li>
<li id="defid61">keyword2<input type="hidden" value="61" /></li>
<li id="defid62">Keyword3<input type="hidden" value="62" /></li>
</ul>
<div id="html">Lorem ipsum keyword1 dolor keyword2 sit keyword3 amet, consectetur adipisicing elit, sed do eiusmod tempor</div>
我有一个关键字列表 (ul > li),并且有一个带有一些文本的字符串。我想用<a>-tag 包装每次出现的关键字。我的代码在 Firefox 和 chrome 中运行良好,但 IE(8) 与正则表达式不匹配。
jQuery(function($) {
// created by Gracenotes
// http://goo.gl/MTkcY
RegExp.quote = function(str) {
return str.replace(/([.?*+^$[\]\\(){}-])/g, "\\$1");
};
var $node = $('#html'),
// the dom element
html = $node.html(); // the text we'll manipulate
$('#definitions li').each(function() {
var defid = $(this).find('input').val(),
deftext = $(this).html().split("<input")[0],
//the keyword
//pattern = eval('/\\b('+RegExp.quote(deftext)+')\\b/gi');
pattern = new RegExp('\\b(' + RegExp.quote(deftext) + ')\\b', 'gi');
html = html.replace(pattern, '<a href="#id=' + defid + '">$1</a>');
});
// replace the dom content with our updated text
$node.html(html);
});
【问题讨论】:
-
var pattern = new RegExp('\\b(' + def + ')\\b', 'gi');会发生什么?使用“eval()”似乎很恶心。 -
你仍然可以避免 eval() ——并不是说特殊的操作团队会从你的天花板下降并偷走你的键盘或任何东西;但 RegExp 是适合这项工作的工具 :)
-
你说的很对,我不会再这样做了;)
标签: javascript jquery regex internet-explorer