Spo*_*ike 3 php regex preg-match-all
我正在尝试匹配%s中包含的子字符串,但preg_match_all似乎在同一行中同时包含多个子字符串.
代码如下所示:
preg_match_all("/%.*%/", "%hey%_thereyou're_a%rockstar%\nyo%there%", $matches);
print_r($matches);
Run Code Online (Sandbox Code Playgroud)
这产生以下输出.
Array
(
[0] => Array
(
[0] => %hey%_thereyou're_a%rockstar%
[1] => %there%
)
)
Run Code Online (Sandbox Code Playgroud)
但是我希望它能生成以下数组:
[0] => %hey%
[1] => %rockstar%
[2] => %there%
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
Ada*_*kin 12
用" ." 替换正则表达式中的" [^%]":
preg_match_all("/%[^%]*%/", "%hey%_thereyou're_a%rockstar%\nyo%there%", $matches);
Run Code Online (Sandbox Code Playgroud)
发生的事情是" ."尽可能"贪婪"地匹配,包括一切直到最后的%.用否定的字符类" [^%]" 替换它意味着它将匹配除百分之外的任何东西,这将使它只匹配你想要的位.
另一个选择是?在点后面放一个" ",告诉它"不要贪婪":
preg_match_all("/%.*?%/", "%hey%_thereyou're_a%rockstar%\nyo%there%", $matches);
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,任何一个选项都可以使用,但有时您可能会搜索大于单个字符的内容,因此否定的字符类将无济于事,因此解决方案是取消对该匹配的贪婪.