2014-10-01 189 views
0

我允许用户输入转换为MathJax的BBCodes;但是,有一个问题,如下所示。JavaScript ReGeX:替换两个字符串之间的匹配字符串

function chatFormat(text){ 
    text = text.replace('\\', ''); 
    text = text.replace(/\[f\](.+?)\/(.+?)\[\/f\]/igm, '\\(\\frac{\\text{$1}}{\\text{$2}} \\)'); 
    text = text.replace(/\[eq\](.+?)\[\/eq\]/igm, '\\($1 \\)'); 
    text = text.replace(/(.+?)\^(.+?)/igm, '\\($1^{\\text{$2}} \\)'); 
    text = text.replace(/\[sqrt\](.+?)\[\/sqrt\]/igm, '\\(\\sqrt{\\text{$1}} \\)'); 

    return text; 
} 

工作得很好。它将BBCode完美转换为适当的命令;但是,如果您开始嵌套命令,则存在问题。例如:

如果用户类型:

[eq]15^2 = [sqrt]225[/sqrt][/eq]

将转换为:

\(15^{2} = \(\sqrt{225} \) \)

  ^  ^
      |   | 
      |   | 
      |   | 
       HOW TO AVOID 

我怎样才能避免额外\(\)当他们嵌套BBCodes,就像[eq] bbcode中的平方根命令一样?

谢谢!

回答

1

这对于正则表达式可能会非常困难,因为您不能使用它们来匹配任意嵌套的模式(请参阅,例如Can regular expressions be used to match nested patterns?)。如果你确实需要这种复杂的嵌套解析,那么你最好写一个真正的解析器......或者更好,因为BBCode很常见,使用一个已经存在的解析器。这里有一个看起来相当可扩展的,可能适合您的需求:https://github.com/patorjk/Extendible-BBCode-Parser

+0

对不起,您觉得哪个链接需要在答案中更好地解释?第一点是关于这个普遍问题的一个高度优先的stackoverflow主题(为什么正则表达式不适合解析嵌套表达式),而第二个链接指向一个可以解决这个特定问题的库。 – caseygrun 2014-10-01 05:02:44

相关问题