正则表达式匹配%之间的字符串

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)

在上面的例子中,任何一个选项都可以使用,但有时您可能会搜索大于单个字符的内容,因此否定的字符类将无济于事,因此解决方案是取消对该匹配的贪婪.