如何指定匹配第一个关闭括号,它始终匹配最后一个

时间:2013-06-10 09:44:59

标签: php regex preg-match

我有一个像这样的字符串 -

"UberMedia/".base64_decode("RWNobw==")."fon/Tablet/App/iOS/".base64_decode("EWNobw==")."fon/".base64_decode("TWNobw==")."fon"

我想收集base64_decode()中的所有字符串,即本例中的以下三个字符串 -

1. "RWNobw=="
2. "EWNobw=="
3. "TWNobw=="

我试过

使用以下正则表达式 -

preg_match_all("/base64_decode\(\"(.*)\"\)/",$string,$matches);

我收到了这个输出 -

Array
(
    [0] => base64_decode("RWNobw==")."fon/Tablet/App/iOS/".base64_decode("EWNobw==")."fon/".base64_decode("TWNobw==")
    [1] => RWNobw==")."fon/Tablet/App/iOS/".base64_decode("EWNobw==")."fon/".base64_decode("TWNobw==
)

您可以看到它匹配字符串中")的最后一次出现(跨越第一个和第三个base64_decode()函数)。

如何更改它以使所有三次出现的base64_decode()都被单独考虑,我可以得到如上所述的三个字符串。

3 个答案:

答案 0 :(得分:1)

默认情况下,量词(本例中为*)将尽可能匹配。您可以使用延迟量词,而不是在其后添加?,例如:

base64_decode\("(.*?)"\)

或甚至更好地限制群组内容可以匹配的内容,例如:

base64_decode\("([^"\s]*)"\)

答案 1 :(得分:1)

您需要的是

/(?<=base64_decode\()[^)]+(?=\))/

这些是非捕获组(在[^)]之前和之后,将完全返回您需要的组:

Array
(
[0] => Array
    (
        [0] => "RWNobw=="
        [1] => "EWNobw=="
        [2] => "TWNobw=="
    )

)

具体来说:

  • (?<=base64_decode\()匹配主表达式之前的组,而不将其包含在结果中。
  • (?=\))匹配主表达式后的组,而不将其包含在结果中。
  • [^)]+是主要表达式,它匹配任何非闭括号的字符

答案 2 :(得分:0)

这是你的问题的解决方案,我正在粘贴我做过测试的代码。

$string = '"UberMedia/".base64_decode("RWNobw==")."fon/Tablet/App/iOS/".base64_decode("EWNobw==")."fon/".base64_decode("TWNobw==")."fon"';

preg_match_all("/(base64_decode\(\"[A-Za-z0-9=]+\"\))/",$string,$matches);


print_r($matches);

将产生

阵 (     [0] =&gt;排列         (             [0] =&gt; BASE64_DECODE( “RWNobw ==”)             [1] =&gt; BASE64_DECODE( “EWNobw ==”)             [2] =&gt; BASE64_DECODE( “TWNobw ==”)         )

[1] => Array
    (
        [0] => base64_decode("RWNobw==")
        [1] => base64_decode("EWNobw==")
        [2] => base64_decode("TWNobw==")
    )