Javascript替换第一个和最后一个字体标记

时间:2015-01-25 23:43:19

标签: javascript regex parsing

我正在尝试将html转换为bbcode。

我的代码:

var html = "<font color=\"Green\"><font size=\"4\">test</font></font>"

html = html.replace(/\<font color="(.*?)"\>(.*?)\<\/font\>/ig, "[color=$1]$2[/color]");

结果:

[color=Green]<font size="4">test[/color]</font>

但我需要另外

[color=Green]<font size="4">test</font>[/color]

请你纠正我的错误。抱歉我的英文。

2 个答案:

答案 0 :(得分:0)

你将很难用正则表达式解析html,你可以从这个网站上的很多帖子中看到它。 Html不是常规语言,因此无法以这种方式解析。话虽这么说,如果问题很简单就应该是可能的。

这是一个可以在非常简单案例中使用的解决方案,以获得第一个和最后一个部分

var  html = "<font color=\"Green\"><font size=\"4\">test</font></font>"
    ,findTag = /<.*?>|([^<]+)/g
    ,part
    ,allParts = []
    ;
while((part = findTag.exec(html)) !== null) {
  allParts.push(part[0]);
}
console.log(allParts)
var  first = allParts[0]
    ,last = allParts.slice(-1)[0]
    ;
console.log(first, last);

然后您可以像之前那样解析第一个和最后一个,然后使用array.join()加入所有内容。

但同样,这只会在简单的情况下起作用。

答案 1 :(得分:-1)

使用否定前瞻:

html = html.replace(/\<font color="(.*?)"\>(.*?)\<\/font\>(?!\<\/font\>)/ig, "[color=$1]$2[/color]");

要解释这里发生了什么:我使用的模式完全属于你,除了附加的(?!\<\/font\>)。这种所谓的负向前瞻基本上是这样说:“如果我没有遇到</font>下一个,那么只会让这个匹配”。