我有一个像这样的字符串:
[abc] 12345 [abc] 67890 [/abc] [/abc]
我想匹配括号内的内容,但如果找到另一个开括号(例如[abc]
)则不返回匹配项。函数/\[abc\](.*)\[\/abc\]/i
将输出:
12345 [abc] 67890 [/abc]
但这不是我想要的,因为文本中还有另一个开头括号。预期结果将是:
67890
关于如何解决它的任何建议?
答案 0 :(得分:3)
是的,只是声明您不希望使用[^\[\]]*
而不是.*
(这将匹配任何,包括括号)在您的代码之间添加括号:
/\[abc\]([^\[\]]*)\[\/abc\]/i
答案 1 :(得分:0)
尝试这种模式:
\[[^\/\]]*\]([^\[]*)\[\/[^\]]*\]
\[
--->字符[
[^\/\]]*
--->读取数据直到达到]
或/
\]
--->字符]
[^\[]*
--->读取数据直到字符[
到达
()
--->表示我们可以选择该组作为\1
答案 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]
,然后选择下一个数字。