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

Php 用正则表达式解析方括号,php,regex,debugging,Php,Regex,Debugging,我对正则表达式一直很难理解。我已经在这方面寻求帮助,但我找不到我想要的 我的文本块遵循以下模式: [菲律宾] ... 这里有任何类型的代码示例 [/php] 我需要: 检查方括号,它可以包含任意数量的20-30个编程语言名称(php,ruby,等等) 需要抓住打开和关闭支架之间的所有代码 我计算出了以下正则表达式: \[(\w+)\].*?\[/\1\] \[([a-z]+)\]([^\[/]*)\[/([a-z]+)\]\i 它与所有内容都非常匹配。但是,当代码示例包含方括号时,它会中断

我对正则表达式一直很难理解。我已经在这方面寻求帮助,但我找不到我想要的

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

[菲律宾] ... 这里有任何类型的代码示例 [/php]

我需要:

  • 检查方括号,它可以包含任意数量的20-30个编程语言名称(
    php
    ruby
    ,等等)
  • 需要抓住打开和关闭支架之间的所有代码
我计算出了以下正则表达式:

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


它与所有内容都非常匹配。但是,当代码示例包含方括号时,它会中断。我如何修改它,以便这些大括号之间的任何字符都可以匹配以供以后使用?

为什么不使用以下内容:

\[php\].*?\[/php\]
我不明白你为什么要用[a-z]+来做标记,应该有
php
或者少量的其他标记。保持简单

实际上,您可以使用:

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

这样您就可以匹配开始和结束标记。否则您将匹配随机开始和结束。添加其他类似的,我不知道,js等作为
php | js
等。

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

/\[(\w+)\](.*?)\[\/\1\]/s
或者,如果您希望显式匹配可以使用的标记

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

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

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

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

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

以下工作将起作用:

\[([a-z]+)\].*\[/\1\]
如果你不想消除贪婪,你可以:

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

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

这也捕获了破坏反向引用的
*?
部分。@重构它是如何破坏反向引用的?在
\1
之前,您缺少了一个
/
,您会有类似于
[php]打印“[/php]”的东西吗?[/php]
?如果是这样的话,正则表达式对您的帮助将非常大。检测类似的东西所需的正则表达式将非常复杂,您最好使用一个完整的解析器。