正则表达式替换不在IE中工作

时间:2011-11-08 16:04:14

标签: javascript jquery regex internet-explorer

好的,我已经使用以下答案和评论中的改进代码更新了这个问题,更类似于真实项目。但它仍然无法在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>标签包装每个匹配关键字。我的代码在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);

});

3 个答案:

答案 0 :(得分:2)

这应该有效:

var pattern = new RegExp('\b('+def+')\b','gi');

passing variable to a regexp in javascript

答案 1 :(得分:1)

这适用于IE 8; test it in this fiddle

这就是我的所作所为:

  • 用RegExp
  • 替换了eval()
  • 在使用正则表达式
  • 之前转义了参考文本
  • 因为您没有提供该代码而捏造了一个ID

这是代码

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 $this   = $(this),
            //I didn't know where defid came from
            //so I just added it as id attribute
            defid   = $this.attr('id'), 
            deftext = $(this).text(), //the keyword
            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);

});

答案 2 :(得分:0)

好的,实际问题在于我在问题的第一个版本中没有提供的代码。我使用了代码deftext = $(this).html().split("<input")[0],它在IE8中不起作用,因为IE将标签更改为大写字符。像FF和Chrome这样的浏览器不会这样做。因此,使用eval()来创建表达式确实有效,并不是真正的问题:这里演示http://jsfiddle.net/zluiten/79rhW/