2014-05-25 145 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運行並在「|」上運行一個爆炸,將它推到一個數組,然後繁榮的炸藥,你有你在找什麼。

相關問題