2011-03-17 83 views
1

我有過類似的一個很長的字符串:問題的正則表達式和preg_match_all

$text = "[23,64.2],[25.2,59.8],[25.6,60],[24,51.2],[24,65.2],[3.4,63.4]"; 

它們的座標。我想每一個X,從[]中 我真的很討厭正則表達式Ÿ提取,我仍然有問題,把它寫正確

我試圖

$pattern = "#\[(.*)\]#"; 
preg_match_all($pattern, $text, $matches); 

但沒有奏效。任何人都可以幫助我嗎?

回答

0

您應該使用.*?使它不那麼貪婪。否則,它可能會匹配太長的子字符串。在你的情況下,使用否定字符類([^[\]]*)有時也很有幫助。

但它總是最好要格外具體你想要什麼:

preg_match_all("#\[([\d,.]+)]#", $text, $matches); 

這樣,它只會匹配\ d ecimals和逗號和點。哎呀,開頭[需要逃脫。

preg_match_all("#\[([\d.]+),([\d.]+)]#", $text, $matches, PREG_SET_ORDER); 

已經給你分開的X和Y座標。也嘗試PREG_SET_ORDER作爲第四個參數,它會給你:

Array 
(
    [0] => Array 
     (
      [0] => [23,64.2] 
      [1] => 23 
      [2] => 64.2 
     ) 

    [1] => Array 
     (
      [0] => [25.2,59.8] 
      [1] => 25.2 
      [2] => 59.8 
     ) 

    [2] => Array 
     (
      [0] => [25.6,60] 
      [1] => 25.6 
      [2] => 60 
     ) 
0

你需要讓星號「懶」:

$pattern = "#\[(.*?)\]#"; 

但是這個怎麼樣?

$pattern = "#\[(\d+(\.\d+)?),(\d+(\.\d+)?)\]#"; 

在你的代碼,這將產生

Array 
(
    [0] => Array 
     // ... 

    [1] => Array 
     (
      [0] => 23 
      [1] => 25.2 
      [2] => 25.6 
      [3] => 24 
      [4] => 24 
      [5] => 3.4 
     ) 

    [2] => Array 
     //... 

    [3] => Array 
     (
      [0] => 64.2 
      [1] => 59.8 
      [2] => 60 
      [3] => 51.2 
      [4] => 65.2 
      [5] => 63.4 
     ) 

    [4] => Array 
     //... 
) 
+0

非常感謝!剛纔意識到我還沒有理解這個數組是二維的。回顯$匹配時,我不斷收到錯誤「數組」[1]。 $ matches [1] [0]效果更好,現在只需構建循環。 再次感謝!問題已修復 – Marco 2011-03-17 17:57:45

0

這應做到:

$string = '[23,64.2],[25.2,59.8],[25.6,60],[24,51.2],[24,65.2],[3.4,63.4]'; 
if (preg_match_all('/,?\[([^\]]+)\]/', $string, $matches)) { 
    print_r($matches[1]); 
} 

它打印:

[0] => string(7) "23,64.2" 
[1] => string(9) "25.2,59.8" 
[2] => string(7) "25.6,60" 
[3] => string(7) "24,51.2" 
[4] => string(7) "24,65.2" 
[5] => string(8) "3.4,63.4" 

正則表達式的分項數字:

,?  // zero or one comma 
\[  // opening bracket 
([^\]]+) // capture one or more chars until closing bracket 
\]  // closing bracket 

要得到x,y座標,然後你可以:

$coords = array(); 
foreach ($matches[1] as $match) { 
    list($x, y) = explode(',', $match); 
    $coords[] = array(
    'x' => (float)$x, 
    'y' => (float)$y 
); 
}