使用正则表达式解析方括号

时间:2011-06-01 04:52:59

标签: php regex debugging

我一直很难用正则表达式。我一直在寻找帮助,但我找不到我想要的东西。

我有以下模式的文本块:

[PHP] ...这里有任何类型的代码示例 [/ PHP]

我需要:

  • 检查方括号,它可以包含任意数量的20-30个编程语言名称(phpruby等)。
  • 需要在开始和结束括号之间抓取所有代码。

我制定了以下正则表达式:

#\[([a-z]+)\]([^\[/]*)\[/([a-z]+)\]#i

哪一切都很好。但是,当代码示例包含方括号时,它会中断。如何修改它以便匹配这些打开/关闭括号之间的任何字符以供以后使用?

5 个答案:

答案 0 :(得分:5)

这是你想要的正则表达式。它匹配标记的位置,因此php标记只会结束php标记。

/\[(\w+)\](.*?)\[\/\1\]/s

或者如果你想明确匹配你可以使用的标签......

$langs = array('php', 'python', ...); 

$langs = implode('|', array_map('preg_quote', $langs));

preg_match_all('/\[(' . $langs . ')\](.*?)\[\/\1\]/s', $str, $matches);

答案 1 :(得分:1)

以下内容可行:

\[([a-z]+)\].*\[/\1\]

如果您不想消除贪婪,可以这样做:

\[([a-z]+)\].*?\[/\1\]

您所要做的就是检查结束标记和开始标记是否具有相同的文本(在这种情况下,两者都是相同的编程语言),然后使用\1执行此操作,告诉它匹配之前匹配的组号1:([a-z]+)

答案 2 :(得分:0)

不确定您使用哪种语言,但遵循非贪婪的正则表达式应该适合您:

#\[([a-z]+)\](.*?)\[/(\1)\]#i

在使用非贪婪修饰符non-opening-square-bracket

获取[之前,不要查找.*?匹配所有内容

答案 3 :(得分:0)

为什么不使用下面的内容:

\[php\].*?\[/php\]

我不明白为什么你要为标签使用[a-z] +,应该有php或有限数量的其他标签。保持简单。

实际上你可以使用:

\[(php)\].*?\[/(\1)\]

以便您可以匹配开始和结束标记。否则你将匹配随机开启和关闭。添加其他像,我不知道,js等为php|js等。

答案 4 :(得分:0)

使用反向引用来引用已在正则表达式中进行的匹配:

\[(\w+)\].*?\[/\1\]