2013-02-22 3 views
3

Я хочу, чтобы манипулировать DOM немного и нужна помощь.Заменить скобки, чтобы охватить Javascript

Это мой HTML-разметки:

<span class=“content“> This is my content: {#eeeeee}grey text{/#eeeeee} {#f00000}red text{/#f00000}</span> 

Вот как это должно быть:

<span class="content">This is my content: <span style="color:#eeeeee;">grey text</span><span style="color:#f00000;">red text</span></span> 

Скрипт должен заменить скобки с пролетами тегами, чтобы изменить цвет шрифта. Цвет должен быть тем же, что и в скобке.

Мой подход:

function regcolor(element) { 
    var text = element.innerText; 
    var matches = text.match(/\{(#[0-9A-Fa-f]{6})\}([\s\S]*)\{\/\1\}/gim); 
    if (matches != null) { 
     var arr = $(matches).map(function (i, val) { 
      var input = []; 
      var color = val.slice(1, 8); 
      var textf = val.slice(9, val.length - 10); 
      var html = "<span style=\"color: " + color + ";\">" + textf + "</span>"; 
      input.push(html); 
      return input; 
     }); 

     var input = $.makeArray(arr); 

     $(element).html(input.join('')); 
    }; 

Но это не работает очень хорошо и я не чувствую себя хорошо с кодом, это выглядит неаккуратно. И скрипт теряет содержимое, которое не находится в скобках («Это мое содержание:»).

Любой идея?

+0

Планируете ли вы блокировать гнездовые блоки? например '{first} некоторый текст {второй} здесь {/ second} {/ first}' – TheBronx

ответ

6

Я использовал только прикосновение JQuery, но он легко может обойтись. Это просто замена строки регулярного выражения.

$('.content').each(function() { 
    var re = /\{(#[a-z0-9]{3,6})\}(.*?)\{\/\1\}/g; 
    //  ^    ^
    //   $1    $2 

    this.innerHTML = this.innerHTML.replace(re, function($0, $1, $2) { 
    return '<span style="color: ' + $1 + '">' + $2 + '</span>'; 
    }); 
}); 

Я использую обратную ссылку для правильного соответствия открывающей и закрывающей скоб.

Update

Может быть еще короче:

$('.content').each(function() { 
    var re = /\{(#[a-z0-9]{3,6})\}(.*?)\{\/\1\}/g, 
    repl = '<span style="color: $1">$2</span>'; 

    this.innerHTML = this.innerHTML.replace(re, repl); 
}); 

Смотри мама, нет JQuery

var nodes = document.getElementsByClassName('content'); 

for (var i = 0, n = nodes.length; i < n; ++i) { 
    var re = /\{(#[a-z0-9]{3,6})\}(.*?)\{\/\1\}/g, 
    repl = '<span style="color: $1">$2</span>'; 

    nodes[i].innerHTML = nodes[i].innerHTML.replace(re, repl); 
} 
+0

Спасибо, он работает :) –

1

Используйте регулярные выражения, чтобы сразу заменить матчи:

function regcolor2(element) { 
    var text = element.html(); 
    var i = 0; 
    var places = text.replace(/\{(#[0-9A-Fa-f]{6})\}([\s\S]*)\{\/\1\}/gim, function(match) { 
     var color = match.slice(1, 8); 
     var textf = match.slice(9, match.length - 10); 
     var html = "<span style=\"color: " + color + ";\">" + textf + "</span>"; 
     return html; 
    }); 

    $(element).html(places); 
} 
1

может быть короче, с JQuery, и этот метод или синтаксис

$(function() { 

$('.content').html($('.content').text().replace(new RegExp('{(.*?)}(.*?){\/.*?}','g'), '<span style="color:$1">$2</span>')); 

}); 
Смежные вопросы