$s= #sayhi aaa #牢骚 bbb #test ccc 想要匹配出 #sayhi #牢骚 #test 这种标签,于是用: preg_match_all("/#[a-zA-Z0-9\x{4e00}-\x{9fa5}]+<\\/span>/u", $s, $catspan); 匹配出的$catspan是 Array ( [0] => Array ( [0] => #sayhi aaa #牢骚 bbb #test ) ) 接下来该怎么办? 回复内容: $s= #sayhi aaa #牢骚 bbb #test ccc 想要匹配出 #sayhi #牢骚 #test 这种标签,于是用: preg_match_all("/#[a-zA-Z0-9\x{4e00}-\x{9fa5}]+<\\/span>/u", $s, $catspan); 匹配出的$catspan是 Array ( [0] => Array ( [0] => #sayhi aaa #牢骚 bbb #test ) ) 接下来该怎么办? preg_match_all("/.*>#[a-zA-Z0-9x{4e00}-x{9fa5}]+<\/span>/u", $s, $catspan); 问题在这个.*上,正则默认是贪婪匹配,而.本身就代表所有字符,自然包括>在内,所以就把后面的内容都匹配进去了。通过修改为.*?可以实现非贪婪匹配,这样就能正确结束于>上,获得你想要的结果。 $pattern = "/\]+\>[^\<]+\<\/span\>/"; preg_match_all('/]+>#[^<]+<\\/span>/', $s, $catspan); 我的正则会这么写: ]*?>#[\s\S]*? 不清楚你的写法是什么情况。