2

我有一个这样的字符串:

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

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

12345 [abc] 67890 [/abc]

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

67890

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

4

4 回答 4

3

是的,只需声明您不想通过使用[^\[\]]*而不是在标签之间允许括号.*(这将匹配任何东西,包括括号):

/\[abc\]([^\[\]]*)\[\/abc\]/i
于 2013-05-02T05:30:53.840 回答
0

试试这个模式:

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

\[---> 字符[

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

\]---> 字符]

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

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

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

于 2013-05-02T06:02:29.250 回答
0

没什么新鲜的,但写得更短:

$subject = '[abc] 12345 [abc] 67890 [/abc] [/abc]';
$pattern = '~\[abc]\K[^[]++(?=\[/abc])~i';
preg_match($pattern, $subject, $result);
于 2013-05-02T06:51:13.627 回答
0

检查此模式:

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

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

于 2013-05-02T07:12:10.340 回答