2011-03-13 33 views
2

我试图删除使用JavaScript的矩形括号(bbcode样式),这是为了删除不需要的bbcode。 我尝试这个。使用正则表达式去除phpbb标记javascript

theString .replace(/\[quote[^\/]+\]*\[\/quote\]/, "") 

它的工作原理与此字符串样本:

theString = "[quote=MyName;225]Test 123[/quote]"; 

将这个样本中失败:

theString = "[quote=MyName;225]Test [quote]inside quotes[/quote]123[/quote]"; 

,如果有正则表达式旁边的任何解决方案没有问题

+0

您可以检查替换后的正则表达式是否仍然匹配。在这种情况下,再次使用替换代码,直到所有事件都被替换。 – pimvdb 2011-03-13 12:30:48

+0

,这将无法正常工作,因为第一次替换只会匹配像这样:** [quote = MyName; 225]测试[quote]里面的引号[/ quote] ** 123 [/ quote]“之后,正则表达式不匹配 – Chris 2011-03-13 12:36:16

+0

你是对的 - 一个实际上需要从内部引号到外部引号。 – pimvdb 2011-03-13 12:37:52

回答

0

这个答案有缺陷,请参阅Ridgerunner的更正确答案。

这是我的破解。

function filterQuotes(text) 
{ 
    return text.replace(/\[(\/)?quote([^\/]*)?\]/g,""); 
} 
+0

好的谢谢,它的工作完全像我想要的 – lutpiero 2011-03-13 13:03:28

+0

很高兴听到它,欢迎来到社区。不要忘记接受/推广答案。 – 2011-03-13 13:06:00

+0

这个正则表达式:'/ \ [(\ /)?quote([^ \ /] *)?\]/g'不起作用。如果QUOTE中有其他标签,情况就会变差。例如'[quote]你好[我]有[\ i]世界![/ quote]' – ridgerunner 2011-03-13 18:53:03

1

试试这个:

/\[quote[^\/]+\].*\[\/quote\]$/ 

$符号表示只应使用字符串末尾的结束引号元素来确定您尝试删除的引号的结尾。

我添加了一个“。”在星号之前,这样就可以匹配两者之间的任何符号。我用你的两个字符串测试了它,它工作。

编辑:我不完全知道你是如何使用它。但只是一个补充。如果你想在模式也匹配到没有属性被添加的字符串,例如:

[quote]Hello[/quote] 

你应该改变“+”号变成一个星号,以及这样的:

/\[quote[^\/]*\].*\[\/quote\]$/ 
+0

是的,它工作,但它不工作,如果有另一个字符串[/ quote] – lutpiero 2011-03-13 12:53:15

+0

这个正则表达式: '/ \ [quote [^ \ /] * \]。* \ [\/quote \] $ /'不起作用,当两个QUOTE串联时,'[quote] Hello1 [/ quote]这也被删除了! [quote] Hello2 [/ quote]' – ridgerunner 2011-03-13 19:24:40

+0

是的,这是主意。整个评论块应该被删除,我认为... – Chris 2011-03-13 20:29:09

2

其他2个解决方案根本不起作用(请参阅我的意见)。为了解决这个问题,你首先需要制作一个匹配最内层匹配的引用元素(既不包含[QUOTE..]也不包含[/QUOTE])的正则表达式。接下来,您需要迭代,一遍又一遍地应用这个正则表达式,直到没有更多的QUOTE元素离开。这个测试的功能你想要做什么:

function filterQuotes(text) 
{ // Regex matches inner [QUOTE]non-quote-stuff[/quote] tag. 
    var re = /\[quote[^\[]+(?:(?!\[\/?quote\b)\[[^\[]*)*\[\/quote\]/ig; 
    while (text.search(re) !== -1) 
    { // Need to iterate removing QUOTEs from inside out. 
     text = text.replace(re, ""); 
    } 
    return text; 
} 

注意,这个表达式采用杰弗里·弗里德尔的“解开循环”效率技术,不仅准确,而且是相当快的启动。

请参阅:Mastering Regular Expressions (3rd Edition)(强烈推荐)。

+0

+1非常好的ridgerunner,没想到那种可能性。 – 2011-03-13 22:14:40