我有一个像这样的字符串 -
"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()都被单独考虑,我可以得到如上所述的三个字符串。
答案 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==")
)
)