4

うまくいけば、これは簡単なものです。CSVファイルからの出力を含む行を含む配列があります。私がする必要があるのは、二重引用符の間にあるコンマを削除することです。

正規表現に出くわして困っています。これが私の悲しそうなコードです:

<?php    

$csv_input = '"herp","derp","hey, get rid of these commas, man",1234';

$pattern = '(?<=\")/\,/(?=\")'; //this doesn't work

$revised_input = preg_replace ( $pattern , '' , $csv_input);

echo $revised_input;

//would like revised input to echo: "herp","derp,"hey get rid of these commas man",1234

?>

みなさん、どうもありがとうございました。

4

5 に答える 5

8

元の回答

str_getcsv()CSV文字列を処理するために意図的に設計されているため、これを使用できます。

$out = array();
$array = str_getcsv($csv_input);
foreach($array as $item) {
    $out[] = str_replace(',', '', $item);
}

$outコンマを含まない要素の配列になりました。コンマが削除されると引用符が不要になるため、内破することができます。

$revised_input = implode(',', $out);

コメントの更新

引用符が重要な場合は、次のように追加して戻すことができます。

$revised_input = '"' . implode('","', $out) . '"';

もう 1 つのオプションは、このstr_putcsv()ような Web 上に出回っている (標準の PHP 関数ではない) 実装の 1 つを使用することです。

于 2012-05-24T14:06:00.723 に答える
2

これは非常に素朴なアプローチであり、「有効な」コンマが引用符の間にあり、間に空白が含まれている場合にのみ機能します。

<?php    

$csv_input = '"herp","derp","hey, get rid of these commas, man",1234';

$pattern = '/([^"])\,([^"])/'; //this doesn't work

$revised_input = preg_replace ( $pattern , "$1$2" , $csv_input);

echo $revised_input;

//ouput for this is: "herp","derp","hey get rid of these commas man",1234

もっとテストする必要がありますが、この場合は機能します。

うまくいかない場合は、文字列に引用符がない場合です。

ワン、ツー、スリー、フォー -> ワンツースリーフォー

編集: スペースと隣接する文字の削除に関する問題を修正しました。

于 2012-05-24T14:14:19.523 に答える
0

あなたは間違った角度からこれに来ているかもしれません。

テキストからコンマを削除する代わりに (おそらく、カンマで文字列を分割して個別の要素を取得できるようにするため)、引用符で機能するものを書いてみませんか?

開始引用符が見つかったら、残りの文字列を確認できます。次の引用符の前にあるものはすべて、この要素の一部です。ここにいくつかのチェックを追加して、エスケープされた引用符を探すこともできます。

"this is a \"quote\""

それでも正しく読み取られます。

于 2012-05-24T14:07:59.257 に答える