如何使用正则表达式在括号之间获取内容

时间:2013-05-02 05:28:51

标签: regex preg-match

我有一个像这样的字符串:

[abc] 12345 [abc] 67890 [/abc] [/abc]

我想匹配括号内的内容,但如果找到另一个开括号(例如[abc])则不返回匹配项。函数/\[abc\](.*)\[\/abc\]/i将输出:

12345 [abc] 67890 [/abc]

但这不是我想要的,因为文本中还有另一个开头括号。预期结果将是:

67890

关于如何解决它的任何建议?

4 个答案:

答案 0 :(得分:3)

是的,只是声明您不希望使用[^\[\]]*而不是.*(这将匹配任何,包括括号)在您的代码之间添加括号:

/\[abc\]([^\[\]]*)\[\/abc\]/i

答案 1 :(得分:0)

尝试这种模式:

\[[^\/\]]*\]([^\[]*)\[\/[^\]]*\]

\[ --->字符[

[^\/\]]* --->读取数据直到达到]/

\] --->字符]

[^\[]* --->读取数据直到字符[到达

() --->表示我们可以选择该组作为\1

演示 http://rubular.com/r/shwsqTE61R

答案 2 :(得分:0)

没有什么新东西,只是更短的写作:

$subject = '[abc] 12345 [abc] 67890 [/abc] [/abc]';
$pattern = '~\[abc]\K[^[]++(?=\[/abc])~i';
preg_match($pattern, $subject, $result);

答案 3 :(得分:0)

检查此模式:

(\d+)(?:\s*\[/abc\]\s*)+$

它会从右侧看,并跳过所有结束标签,如[/abc],然后选择下一个数字。