-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[フラッシュ]の開始位置

$2幅パラメータ

$3高さパラメータ

コードの最初は、すべての html 要素を BBCode に変更することです。埋め込み正規表現とは異なる正規表現を使用する必要がありますか? 理解を深めるために、こちらの例を参照してください。

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

4

1 に答える 1

1

$('<b>Hello</b>')結局のところ、jQuery は、渡された 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 に答える