-2

代码:

var a = [
 /<b\>(.*?)<\/b\>/ig,
 /<i\>(.*?)<\/i\>/ig, 
 /<u\>(.*?)<\/u\>/ig,
 /<br\/\>(.*?)/ig,
 /<embed(.*?)/ig
 ];

 var b = [
   '[b]$1[/b]',
   '[i]$1[/i]',
   '[u]$1[/u]',
   '\r',
   '[flash($2,$3)]$1[/flash]'
  ];

   for (var i =0;i<a.length;i++) {
    ele = ele.replace(a[i], b[i]);
     }

HTML:

<embed 
 pluginspage="http://www.macromedia.com/go/getflashplayer"
 src="http://www.youtube.com/v/DM0vRHUu6eI"
 width="500" 
 height="500" 
 type="application/x-shockwave-flash" 
 wmode="transparent" 
 quality="high" 
 scale="exactfit">

我想得到的是

$1[flash] 的起始位置

$2宽度参数

$3高度参数

代码的开头是把所有的html元素都改成BBCodes。我应该在嵌入正则表达式中使用不同的正则表达式吗?请参阅此处的示例以更好地理解!

http://jsbin.com/ajeqog/2/edit

4

1 回答 1

1

事实证明 - 如果您知道较少使用的变体,jQuery 正是您正在寻找的东西,例如$('<b>Hello</b>')解析并返回您传递给它的 HTML 的事实。所以你正在寻找这样的东西:

var str = '<b>Hello</b><br/><i>World</i><br/><u>I hate you!</u><br/><ul><li>Good</li><li>Goodbye</li><li>Good afternoon</li><li>Good marrow</li></ul> <embed pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.youtube.com/v/DM0vRHUu6eI" width="500" height="500" type="application/x-shockwave-flash" wmode="transparent" quality="high" scale="exactfit">';

var convertible = {
    B: function(loc){
        return '[b]' + convertToBBCode($(loc).html()) + '[/b]';
    }
    , I: function(loc){
        return '[i]' + convertToBBCode($(loc).html()) + '[/i]';
    }
};
function convertToBBCode(str){
    if (!str || str == undefined) return '';
    var toReturn = '';
    $('<div>'+str+'</div>').contents().each(function(){
        if (this.tagName == undefined) toReturn += this.nodeValue;
        else if (convertible[this.tagName] != undefined)
            toReturn += convertible[this.tagName](this);
        else 
            toReturn += $(this).html(convertToBBCode(this.innerHTML))[0].outerHTML;
    });
    return toReturn;
}

$('textarea').val(convertToBBCode(str));

我还没有完成整个事情,因为我认为正在做的事情是不言而喻的。对你来说最难的部分是 EMBED,它变得像馅饼一样简单:

    , EMBED: function(loc){
        var l = $(loc);
        return '[flash(' + l.attr('width') + ',' + l.attr('height') + ')]' + l.attr('src') + '[/flash]';
    }

您可以在 JSFiddle中看到部分解决方案。

请记住,您应该很少使用正则表达式来解析上下文相关的语言,例如 HTML。当人们告诉您您可能错误地处理问题时,您还应该倾听 - 如果您有正当理由采用非传统方法,您应该向我们说明您认为传统方法失败的地方。

于 2013-08-07T21:52:12.927 回答