регулярное выражение заменить не работает в IE - PullRequest
0 голосов
/ 08 ноября 2011

Хорошо, я обновил этот вопрос улучшенным кодом из ответов и комментариев ниже и более похож на реальный проект.Но все же это не работает в IE8. скрипка здесь

<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 ]

2 голосов
/ 08 ноября 2011

Это должно работать:

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

передача переменной в регулярное выражение в javascript

1 голос
/ 08 ноября 2011

Это работает в IE 8; проверить это на этой скрипке .

Вот что я сделал:

  • заменил eval () на RegExp
  • экранировал текст ссылки перед использованием в регулярном выраженииВы не предоставили этот код

Вот код

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);

});
0 голосов
/ 03 июля 2014

Хорошо, настоящая проблема заключалась в коде, который я не предоставил в первой версии моего вопроса. Я использовал код deftext = $(this).html().split("<input")[0], который не работает в IE8, потому что IE меняет теги на заглавные буквы. Браузеры, такие как FF и Chrome, не делают этого. Таким образом, использование eval () для создания выражения работает и не является проблемой: демонстрация здесь http://jsfiddle.net/zluiten/79rhW/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...