我一直很难用正则表达式。我一直在寻找帮助,但我找不到我想要的东西。
我有以下模式的文本块:
[PHP] ...这里有任何类型的代码示例 [/ PHP]
我需要:
php
,ruby
等)。 我制定了以下正则表达式:
#\[([a-z]+)\]([^\[/]*)\[/([a-z]+)\]#i
哪一切都很好。但是,当代码示例包含方括号时,它会中断。如何修改它以便匹配这些打开/关闭括号之间的任何字符以供以后使用?
答案 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\]