0

我有一个这样的字符串 -

"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(),并且我可以获得上面提到的三个字符串。

4

3 回答 3

1

你需要的是

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

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

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

)

具体来说:

  • (?<=base64_decode\()在您的主要表达式之前匹配一个组,而不将其包含在结果中。
  • (?=\))在您的主要表达式之后匹配一个组,而不将其包含在结果中。
  • [^)]+是主表达式,它匹配任何不是右括号的字符
于 2013-06-10T10:04:22.090 回答
1

默认情况下,量词(*在这种情况下)将尽可能匹配。您可以通过在其后添加一个惰性量词来代替?,例如:

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

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

base64_decode\("([^"\s]*)"\)
于 2013-06-10T09:47:31.850 回答
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] => 数组 ( [0] => base64_decode("RWNobw==") [1] => base64_decode("EWNobw==") [2] => base64_decode("TWNobw==") )

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

)

于 2013-06-10T09:53:49.257 回答