我一直很难处理正则表达式。我一直在寻求帮助,但我找不到我要找的东西。
我有遵循以下模式的文本块:
[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等作为php|js
等
使用backreference引用正则表达式中已经进行的匹配:
'[('w+)'].*?'[/'1']