问题描述
|
我一直很难用正则表达式。我已经在寻求帮助,但是找不到我想要的东西。
我有遵循这种模式的文本块:
[PHP]
...任何类型的代码示例
[/ PHP]
我需要:
检查方括号,方括号可以包含任意数量的20-30编程语言名称(
PHP
,ruby
等)。
需要抓取在左括号和右括号之间的所有代码。
我已经计算出以下正则表达式:
#\\[([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等,例如as14ѭ等。
, 使用后向引用来引用已在正则表达式中进行的匹配:
\\[(\\w+)\\].*?\\[/\\1\\]
, 不确定您使用的是哪种语言,但遵循非贪婪的正则表达式是否适合您:
#\\[([a-z]+)\\](.*?)\\[/(\\1)\\]#i
而不是寻找non-opening-square-bracket
匹配所有内容,直到使用非贪婪修饰符.*?
获得[