2013-01-31 80 views
0

我想编写一个JavaScript函数,它将一些简单的BBcode标签(如[红色] [/红色])转换为Html标签。我认为replace()函数是最好的方法。我写了一个简单的测试函数来尝试它,但似乎并不奏效。用数组元素的RegExp替换()

/** 
* @function 
* @description Replaces the bb-tags with html-tags 
*/ 
function bbToHtml(form) { 
    debugger 

    var text = form.text.value; 
    bbTags = new Array("[red]", "[yellow]", "[green]", "[/red]", "[/yellow]", "[/green]"); 
    htmlTags = new Array("<font color='red'>", "<font color='yellow'>", "<font color='green'>", "</font>", "<font>", "</font>"); 

    for (var i = 0; i < bbTags.length; i++) { 
     var re = new RegExp(bbTags[i], "g"); 
     text = text.replace(re, htmlTags[i]); 
    } 

    alert(text); 
} 

应该转换"[red]hello[/red]""<font color='red'>hello</font>",但它只是给了我一个奇怪的字符串。

出了什么问题?我认为这与我的正则表达式有关。

+1

你可以把你的“它应该转换”...在代码块 - 我认为有一些HTML结构没有出现在问题中。此外,你可以显示“怪异的字符串”是什么? – Floris

+0

是的,什么是奇怪的字符串? –

+0

及其类似的东西,但更长:吨>吨>吨Ç吨>吨>吨><吨>˚F吨>吨> = \ – RandomUser123

回答

2

[]有特殊意义的正则表达式和需要进行转义,而且你不需要正则表达式的方式你写你的代码,可以这样做:

function bbToHtml(form) { 
    debugger 

    var text = form.text.value; 
    bbTags = new Array("[red]", "[yellow]", "[green]", "[/red]", "[/yellow]", "[/green]"); 
    htmlTags = new Array("<font color='red'>", "<font color='yellow'>", "<font color='green'>", "</font>", "<font>", "</font>"); 

    for (var i = 0; i < bbTags.length; i++) { 
     while(text.indexOf(bbTags[i])!==-1){ 
      text = text.replace(bbTags[i], htmlTags[i]); 
     } 
    } 

    alert(text); 
} 

只是为了让你知道,你可以使用数组文字,而不是数组。 new Array(comma seperated values)与javascript中的[comma seperated values]完全相同。 此外,你可以用你喜欢阵在你的情况的地图,例如:

var bbTagsToHTML = {} 
bbTagsToHtml["[red]"] = "<font color='red'>" 

并通过迭代。

如果您希望您也可以逃避正则表达式,请参阅How do you use a variable in a regular expression?以了解这种功能。

您也可以手动执行此操作。 "[red]"变成"\[red\]"(括号溢出)。

0

只是改变这一行

text = text.replace(re, htmlTags[i]); 

text = text.replace(bbTags[i], htmlTags[i]); 

移除无用的代码。

replace也适用于'正常'(而不是正则表达式)值作为参数。

0

如果你想用正则表达式来做,你可以简化很多。无阵列或循环:

var str = '[red]foo[/red] hello world [blue]hey[/blue]', 
    re = /\[(\w+)\](.*)\[\/\1\]/g; 

str = str.replace(re, '<font color="$1">$2</font>'); 

console.log(str); 
//^ <font color="red">foo</font> hello world <font color="blue">hey</font> 

此外,作为一个侧面说明,font很少使用了,我建议你使用span带班。