0

データのサンプル$string = '"word","foo","bar","foobar","barfoo"';

これらのみを使用する前に:

str_replace('"','',$string) 
explode(',',$string)

すべての引用符を削除し、カンマで分割しますが、データのサンプルを見ました:

$string = '"word","foo","bar","foobar","bar,foo"';

データを取得するためにコンマに依存しているため、私のコードは間違っています。

指定された 2 つの文字の内部の部分文字列を取得できる php 関数はありますか? または、ない場合、これを適切に行うために必要な機能について何かアドバイスはありますか?

4

4 に答える 4

2

PHP >=5.3 の場合

CSV文字列を解析して配列にするためのstr_getcsv()という関数があります。これは、単純な正規表現が失敗する文字列に char がある場合にも機能"します (「参考文献」を参照)。foo""barまたは、引用符/エンクロージャーがない場合 (「参考文献」を参照word)。

コード:

$string = 'word,"foo","bar","foo""bar","bar,foo"';
print_r( str_getcsv($string) );

出力:

Array
(
    [0] => word
    [1] => foo
    [2] => bar
    [3] => foo"bar
    [4] => bar,foo
)

PHP < 5.3 の場合

str_getcsv()コメントからの少し変更された例(他の例を参照) エリア:

function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\') {
    $handle = fopen('php://memory', 'rw');
    fwrite($handle, $input);
    fseek($handle, 0);
    $data = fgetcsv($handle, 4096, $delimiter, $enclosure, $escape);
    fclose($handle);
    return $data;
}
于 2013-09-12T06:25:39.117 に答える
1

関数 str_getcsv() は、PHP 5.3.0 以降で使用できます。

PHP の下位バージョンでは、次のようなものを使用できます。

if (!function_exists('str_getcsv')) {

    function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = null, $eol = null) {
        $temp = fopen("php://memory", "rw");
        fwrite($temp, $input);
        fseek($temp, 0);
        $r = array();
        while (( $data = fgetcsv($temp, 4096, $delimiter, $enclosure)) !== false) {
            $r[] = $data;
        }
        fclose($temp);
        return $r;
    }

}

ただし、関数 str_getcsv には注意してください - エンクロージャーが " このケースでテストする場合:

$string = '"wo"rd","fo"o","b"ar","fo"obar","ba"rfoo"';

str_getcsv() 関数で使用する前に、データ内の引用符をエスケープする必要があると思います。

編集

私はいくつかのテストを行いました:

$str1 = '"wo"rd","foo"';
$str2 = '"wo""rd","foo"';
$str3 = '"wo\"rd","foo"';

$test_arr1 = str_getcsv($str1);
$test_arr2 = str_getcsv($str2);
$test_arr3 = str_getcsv($str3);

print_r($test_arr1);
print_r($test_arr2);
print_r($test_arr3);

出力は次のとおりです。

配列 ( [0] => 単語" [1] => foo )

配列 ( [0] => 単語 [1] => foo )

配列 ( [0] => wo\"rd [1] => foo )

結核

于 2013-09-12T06:39:02.700 に答える
1

preg_match_all() 関数を使用できます。

$string = '"word","foo","bar","foobar","bar,foo"';
$pattern = '#"(.*?)"#';
preg_match_all($pattern, $string, $matches);
print_r($matches[1]);

Array
(
    [0] => word
    [1] => foo
    [2] => bar
    [3] => foobar
    [4] => bar,foo
)

または、すべての単語に一致させたい場合:

$pattern = '#([^",]+)#';
preg_match_all($pattern, $string, $matches);
print_r($matches[1]);

Array
(
    [0] => word
    [1] => foo
    [2] => bar
    [3] => foobar
    [4] => bar
    [5] => foo
)
于 2013-09-12T06:27:30.787 に答える