2014-05-25 147 views
0

我有一个preg_match问题,我无法弄清楚。PHP:匹配两个字符串之间的字符串

让代码说:

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代码分开他们,给我每个function::*::end

+2

我只是使用爆炸() –

+0

'爆炸'是不是很漂亮的整个事情,我猜。我用'正则表达式'来进行第一个动作,然后用'explode'爆炸'函数'参数'@Dagon –

回答

1
array

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

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

+0

嘿,这就是我目前使用的。 'preg_match(“/ function ::(。*):: end /”,$ CurrentSotoun ['content'],$ calling_function);'你看到的任何问题? –

+0

是的,量词是贪婪的。你有没有注意到我建议的解决方案中的?? –

+0

我们在这里有一个赢家!它真的帮了我,我的工作时间,现在解决了!非常感谢 ! –

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]进行检索。

+0

这不适用于第二个例子,这是他遇到的问题。 –

+0

然后它就是''S'''''我会说。没有看到该字符串...编辑。 – hakre

+0

这似乎正是我想要的,但我只是测试它,不工作 –

0

这是你在找什么:

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

请确保您有圆点的所有标识设置一致。

当你得到比赛后,通过forloop运行并在“|”上运行一个爆炸,将它推到一个数组,然后繁荣的炸药,你有你在找什么。

相关问题