我有一个这样的字符串:
[abc] 12345 [abc] 67890 [/abc] [/abc]
我想匹配括号内的内容,但如果找到另一个左括号(例如,[abc]
),则不返回匹配项。该函数/\[abc\](.*)\[\/abc\]/i
将输出:
12345 [abc] 67890 [/abc]
但这不是我想要的,因为文本内还有另一个左括号。预期的结果是:
67890
关于如何解决它的任何建议?
我有一个这样的字符串:
[abc] 12345 [abc] 67890 [/abc] [/abc]
我想匹配括号内的内容,但如果找到另一个左括号(例如,[abc]
),则不返回匹配项。该函数/\[abc\](.*)\[\/abc\]/i
将输出:
12345 [abc] 67890 [/abc]
但这不是我想要的,因为文本内还有另一个左括号。预期的结果是:
67890
关于如何解决它的任何建议?
是的,只需声明您不想通过使用[^\[\]]*
而不是在标签之间允许括号.*
(这将匹配任何东西,包括括号):
/\[abc\]([^\[\]]*)\[\/abc\]/i
试试这个模式:
\[[^\/\]]*\]([^\[]*)\[\/[^\]]*\]
\[
---> 字符[
[^\/\]]*
---> 读取数据直到达到]
或/
\]
---> 字符]
[^\[]*
---> 读取数据直到字符[
到达
()
---> 表示组,我们可以选择该组作为\1
没什么新鲜的,但写得更短:
$subject = '[abc] 12345 [abc] 67890 [/abc] [/abc]';
$pattern = '~\[abc]\K[^[]++(?=\[/abc])~i';
preg_match($pattern, $subject, $result);
检查此模式:
(\d+)(?:\s*\[/abc\]\s*)+$
它将从右侧查看并跳过所有结束标签,[/abc]
然后选择下一个数字。