PHP:匹配两个字符串之间的字符串

时间:2014-05-25 20:53:05

标签: php regex

我对preg_match有疑问,我无法弄明白。

让代码说出来:

function::wp_statistics_useronline::end
function::wp_statistics_visitor|today::end
function::wp_statistics_visitor|yesterday::end
function::wp_statistics_visitor|week::end
function::wp_statistics_visitor|month::end
function::wp_statistics_visitor|total::end

这些是在php中运行函数的一些字符串;

当我只使用一个function::*::end时,它工作得很好。 但是当它包含多个功能时,不按我想要的方式工作 它解析匹配,如:

function::wp_statistics_useronline::end function::wp_statistics_visitor|today::end AND ....::end

所以基本上我需要Regex代码将它们分开,并为每个array

给我一​​个function::*::end

3 个答案:

答案 0 :(得分:1)

我假设您实际上使用的是function::(.*)::end,因为function::*::end永远不会起作用(它只能匹配"function::::::end"等字符串。)

你的正则表达式在同一行上有多个匹配失败的原因是,量词*默认是贪婪的,匹配尽可能多的字符。你需要让它变得懒惰:function::(.*?)::end

答案 1 :(得分:1)

非常直接:

$result = preg_match_all('~function::(\S*)::end~m', $subject, $matches) 
          ? $matches[1] : [];

给出了:

Array
(
    [0] => wp_statistics_useronline
    [1] => wp_statistics_visitor|today
    [2] => wp_statistics_visitor|yesterday
    [3] => wp_statistics_visitor|week
    [4] => wp_statistics_visitor|month
    [5] => wp_statistics_visitor|total
)

和(第二个例子):

Array
(
    [0] => wp_statistics_useronline
    [1] => wp_statistics_visitor|today
)

示例中的正则表达式是中间部分周围不包含空格的匹配组。所以\S*非常适合。

由于匹配组是第一个,因此您可以在运行正则表达式后使用$matches[1]检索它。

答案 2 :(得分:0)

这就是你要找的东西:

  

功能\:\:(。*?)\:

确保点匹配所有标识符。

获得比赛后,通过forloop运行并在“|”上运行爆炸,将其推入阵列,然后使用炸药,你就得到了你正在寻找的东西。