2013-04-02 12 views
1

給出的preg_match爲點,空格或製表符

$str=array("Chelsea 0-5 MAN-UNITED", 
      "Chelsea 0-2 Aston Villa", 
      "Chelsea 0-3 Pokemon (TRASH i dont want)"); 

輸出IM試圖達到:

array(
    array('teams'=>'chelsea Vs MAN-UNITED','score'=>'0-5') 
    array('teams'=>'chelsea Vs Aston Villa','score'=>'0-2') 
    array('teams'=>'chelsea Vs Pokemon','score'=>'0-3') 
    ); 

我目前的做法是使用爆炸(」」,$海峽);然後移動[0]。' Vs'。[2]進入球隊和[1]進球得分..

這是工作正常,除非有一個團隊名稱內部空白,或當有額外的文本里面()。

所以這可以使用preg_match來完成?

感謝

回答

1

試試這個:

$str=array("Chelsea 0-5 MAN-UNITED", 
      "Chelsea 0-2 Aston Villa", 
      "Chelsea 0-3 Pokemon (TRASH i dont want)"); 


$arr = array(); 

$pattern = "/([0-9]+\-[0-9]+)/"; 
foreach ($str as $sub) { 
    $parts = preg_split($pattern, $sub, -1, PREG_SPLIT_DELIM_CAPTURE); 
    if (count($parts) == 3) { 
     $team1 = trim(preg_replace("/\(.*\Z/", "", $parts[0])); 
     $score = trim($parts[1]); 
     $team2 = trim(preg_replace("/\(.*\Z/", "", $parts[2])); 

     $teams = "$team1 Vs $team2"; 

     $element = array("teams" => $teams, "score" => $score); 
     $arr[] = $element; 
    } 
} 

print_r($arr); 

輸入:

$str=array("Chelsea 0-5 MAN-UNITED", 
     "Chelsea 0-2 Aston Villa", 
     "Chelsea 0-3 Pokemon (TRASH i dont want)"); 

輸出:

Array 
(
    [0] => Array 
     (
      [teams] => Chelsea Vs MAN-UNITED 
      [score] => 0-5 
     ) 

    [1] => Array 
     (
      [teams] => Chelsea Vs Aston Villa 
      [score] => 0-2 
     ) 

    [2] => Array 
     (
      [teams] => Chelsea Vs Pokemon 
      [score] => 0-3 
     ) 

) 

這是在行動:http://eval.in/14236

哦,並確保你」重新使用至少P惠普4.0.5。那時PREG_SPLIT_DELIM_CAPTURE被引入。

+0

正是我想要的:) ..非常感謝,我希望更多地瞭解preg_match的寫作模式,你能教我一些關於他們的事情嗎?! – Zalaboza

+1

我的書桌上有一本2釐米厚的書,現在在我面前。 RegEx是一個巨大的標準,你可以用它做很多事情。我的建議是在網上尋找教程並從那裏去。哦,在網上有一個名爲RegExr的整潔工具,您可以在其中使用模式匹配。這裏有一個符合你上面的問題:http://regexr.com?34bvu –

3

您可以使用

preg_split('/ (\d+-\d+) /', $str, 3, PREG_SPLIT_DELIM_CAPTURE); 

這將會把您要歸入一個陣列的三個部分。在上面的第一個例子:

array(3) { 
    [0] => 
    string(8) "Chelsea" 
    [1] => 
    string(3) "0-5" 
    [2] => 
    string(11) "MAN-UNITED" 
} 

然後可以進一步篩選第一和第三結果以去除雜質。不幸的是,你沒有給出處理垃圾的具體規則。如果團隊和分數之間可能存在垃圾,除非你知道你在找什麼,否則很難把它拿出來。我也不確定\d+-\d+是否可以出現在除樂譜以外的字符串中的任何位置。

另一種可能性是

preg_match('/([a-z\.\s]+)(\d+-\d+)([a-z\.\s]+)/i', $str, $matches); 

...存儲的三個項目中$matches和擺脫垃圾。但是,它不允許在團隊名稱中使用數字,也不會削減尾隨/前導空格。

+0

我準備好了我的答案,但這樣好多了:) – jcbwlkr

+0

相同。我會離開我的,因爲它處理垃圾括號。但你有我的+1。 –

相關問題