2012-06-06 53 views
0

我自認爲PHP初學者,我還在學習正則表達式。下面是我用preg_match_all遇到問題,陣列正則表達式PHP preg_match_all

我的數組正好有下列信息:

;;CARLOS||ANDREW||STEPH||SUE||JUDY||HAROLD||JAMES||KATIE||JESSICA;; 

我想要做的是單獨顯示每個名字裏有大約250不同的名稱,數組始終以;;開始並始終以;;結尾所以這裏是我的問題,我的第一串負荷正常,但這樣做只是名字:

preg_match_all('/^(.+?)\|\|/', $body, $part); 
    foreach ($part[1] as $part){ 
    print_r($part); 

結果是;;CARLOS

哪裏$body是名稱的巨大列表(數組250+名)。

期望的結果:

CARLOS 
ANDREW 
STEPH 
JUDY 
HAROLD 
JAMES 
KATIE 
JESSICA 

請理解我不能改變輸入數組,這是它是什麼。所以基本上在第一個數組我加載整個列表,然後我需要通過|打破它字符。

感謝您的任何建議。

+1

你看着[爆炸()](http://php.net/explode)和'str_replace'去除分號? – jprofitt

回答

7

這裏沒有必要使用正則表達式。 explodetrim將工作得很好。

$str = trim($body, ";"); // Remove semi-colons 
$arr = explode("||", $str); // Return array of strings delimited by double pipes 

print_r($arr); 

輸出

Array 
(
    [0] => CARLOS 
    [1] => ANDREW 
    [2] => STEPH 
    [3] => SUE 
    [4] => JUDY 
    [5] => HAROLD 
    [6] => JAMES 
    [7] => KATIE 
    [8] => JESSICA 
) 

See in action.

如果你希望你的期望的結果正好,然後implode上面的輸出。

echo implode(" ", $arr); 
// Outputs: CARLOS ANDREW STEPH SUE JUDY HAROLD JAMES KATIE JESSICA 
+0

我不知道你能做到這一點與trim!酷!+1!:-) – Graham

+0

謝謝謝謝謝謝,這開始讓我頭疼!今天,我學習了內爆和修剪:D – user1294097

0

;;CARLOS||是最小的匹配結果,這是你問的正則表達式引擎做什麼。試試這個正則表達式:

preg_match_all('/(?<=\|\||;;)(.+?)(?=\|\||;;)/', $body, $part); 

print_r($part[1]); 
+0

這工作太棒了!完美的我在做什麼,但是混亂作爲即時通訊不知道爲什麼這個工程:?(<=我需要做更多的閱讀同樣是有可能這樣做讓每名到它自己的陣列也許:?'preg_match_all ( '\ |',$部分,$ name_array)' – user1294097

+0

@ user1294097:本'(...?)'是*零寬度斷言*他們的意思是「確保指定的字符是有的,但沒有。實際匹配他們。」這使得字符比賽的其餘部分。另外,如果你的字符串是完全一樣的顯示,使用'trim'和'explode'是一個更好的解決方案。 – Ryan

1
$list = explode('||',trim($list,';')); 
0

我會用explode()代替。

<?php 

$string=";;CARLOS||ANDREW||STEPH||SUE||JUDY||HAROLD||JAMES||KATIE||JESSICA;;"; 

$names=explode("||", substr($string,2,strlen($string)-4)); 

print_r($names); 

給我們:

Array 
(
    [0] => CARLOS 
    [1] => ANDREW 
    [2] => STEPH 
    [3] => SUE 
    [4] => JUDY 
    [5] => HAROLD 
    [6] => JAMES 
    [7] => KATIE 
    [8] => JESSICA 
)