$('<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 のような文脈依存言語を解析するために正規表現を使用することはほとんどありません。また、問題へのアプローチが間違っている可能性が高いと人々が言った場合にも耳を傾ける必要があります。非伝統的なアプローチに正当な理由がある場合は、従来のアプローチが失敗したと思われる点を詳しく説明してください。