用正则表达式分析方括号


Parse for square brackets with regular expressions

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

我有遵循以下模式的文本块:

[php]…这里有任何类型的代码示例[/php]

我需要:

  • 检查方括号,方括号可以包含任意数量的20-30个编程语言名称(phpruby等)
  • 需要获取位于左括号和右括号之间的所有代码

我已经计算出以下正则表达式:

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

这一切都很匹配。但是,当代码示例包含方括号时,它会中断。我该如何修改它,以便匹配那些左大括号/右大括号之间的任何字符以供以后使用?

这是您想要的正则表达式。它甚至匹配标签所在的位置,因此php标签只会结束php标签。

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

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

$langs = array('php', 'python', ...); 
$langs = implode('|', array_map('preg_quote', $langs));
preg_match_all('/'[(' . $langs . ')'](.*?)'['/'1']/s', $str, $matches);

以下操作将起作用:

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

如果你不想消除贪婪,你可以做:

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

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

相匹配

为什么不使用以下内容:

'[php'].*?'[/php']

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

实际上你可以使用:

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

以便您可以匹配打开和关闭标签。否则,您将匹配随机打开和关闭。添加其他如,我不知道,js等作为php|js

使用backreference引用正则表达式中已经进行的匹配:

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