2011-01-15 19 views
0

次の文字列をコンマで区切りたいと思います。この文字列を分割する正規表現

1,"x1",43,"tr","y,7" 

結果配列は次のようになります。

0=>1 
1=>"x1" 
2=>43 
3=>"tr" 
4=>"y,7" 

つまり、引用符の間にカンマを入れてはなりません。

私が爆発を使用する場合、私は欲しくない次の結果を得るでしょう。

[4:58:20 PM] Mihir Dhandha: 0=>1 
1=>"x1" 
2=>43 
3=>"tr" 
4=>"y 
5=>7" 

私はここで詰まっています。

答えて

1

簡単!あなたの文字列はCSVです。

文字列は左から右に読まれていると仮定すると利用$your_array=str_getcsv($your_string);

+0

あなたは私の一日を作った...私はこの小さなPHPの問題で苦労していたので、ネットのコーダーです。あなたは何のようにも簡単に作った:) – Mihir

+0

誰かが私の答えを「不合格」のようにチェックした理由を理解できない。私はそれがOKだと思う。 問題は私の悪い英語ですか? ;) – Curlas

2

次のスニペット:

$s = '1,"x1",43,"tr","y,7"'; 
print_r(preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $s)); 

が生成するには:

Array 
(
    [0] => 1 
    [1] => "x1" 
    [2] => 43 
    [3] => "tr" 
    [4] => "y,7" 
) 

ideoneに見られるように。

正規表現,(?=([^"]*"[^"]*")*[^"]*$)は、コンマをマッチさせることを意味します。コンマにマッチするのは、0または偶数の二重引用符がある場合のみです。

+0

、先に二重引用符の後ろではなく、偶数のため、このチェックは必要がありますか? –

+0

@Rob Young、あなたが先を見ても後ろを見ても問題ありません。多くの正規表現の実装では、明らかな長さを持たないルックバックをサポートしていないことに注意してください。この場合、先を見越した操作が安全な方法です。 (またはもっと安全で、他に提案されているように組み込みのCSV関数を使用してください) –

3

str_getcsvをお試しください:

<?php 

$s = '1,"x1",43,"tr","y,7"'; 
$result = str_getcsv($s); 
var_dump($result); 
echo "\n"; 

// array(5) { 
// [0]=> 
// string(1) "1" 
// [1]=> 
// string(2) "x1" 
// [2]=> 
// string(2) "43" 
// [3]=> 
// string(2) "tr" 
// [4]=> 
// string(3) "y,7" 
// } 


?> 
+0

私にそれを打つ。注:これは5.3以降でのみ動作しますが、コメントには古いバージョンの回避策があります。 – Maerlyn

関連する問題