2011-07-05 45 views
0

我似乎无法让我的代码工作。php preg_replace模式[[和]]

考虑一个字符串

$string = "the [[quick [[brown]] fox [jumps]] over the]] lazy dog"; 

我想删除[[]]因而给我结果“懒狗”所有单词。

使用preg_replace('/\[\[(.*?)\]\]/s', '' ,$string)会给我一个结果:

的]懒狗

哪项是错误的。有没有人有这方面的工作?

+2

它是否必须与正则表达式或您是否打开其他方法? – Jrod

+0

如果有一种比正则表达式更快的替代方法,它会很好。 – ralpu

回答

0

试试这个:

preg_replace('/\[\[.*\]\]/s', '' ,$string) 
+0

这个表达式是贪婪的,所以它不会对类似工作:““在[[快速[棕色]狐狸[跳转]在]懒狗[这也是]”' – efritz

+0

这可能工作对于他的例子字符串,但是[[[quick]]] brown [[fox]]''呢?它将取代太多。 –

+0

垃圾,你说得对。当平衡双。 –

0
/\[\[(?:(?:\[\[.*?\]\]|.)*?)\]\]/s 

手术不同的是(?:\[\[.*?\]\]|.)*?。它不是你的.*?,它首先尝试匹配一个括号内的字符串,如果失败,它会尝试.

+0

这只能达到2级怎么样'的[快速[棕色]狐狸[跳到[另一里面]]]]在]懒dog' – ralpu

+0

正则表达式是出奇的令人印象深刻的,因为它看起来像你试图清理你的键盘,但实际上做的东西。 – Cyclone

+0

@Ralpu,正则表达式不适合递归的东西。如果你想要额外的级别,你可能必须写在PHP ...除非你想移动到.net。 .net正则表达式实现具有可用于解决此问题的附加“深度”功能。 –

1

这将是很难用正则表达式做。我建议你只是手工做。

function replace_brackets($source) { 
    $result = ''; 
    $brackets = 0; 
    foreach (preg_split('/(\[\[|\]\])/', $source, -1, PREG_SPLIT_DELIM_CAPTURE) as $segment) { 
     if ($segment == '[[') { 
      $brackets++; 
     } else if ($segment == ']]') { 
      $brackets--; 
     } else if ($brackets == 0) { 
      $result .= $segment; 
     } 
    } 

    return $result; 
} 

echo replace_brackets("the [[quick [[brown]] fox [jumps]] over the]] lazy dog [[ta]] da\n");