如何在PHP中删除双引号之间的逗号

时间:2012-05-24 14:01:58

标签: php regex quotes double-quotes

希望这很简单。我有一个数组,其中的行包含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

?>

非常感谢大家。

5 个答案:

答案 0 :(得分:6)

原始答案

您可以使用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) . '"';

另一个选择是使用str_putcsv()上的{{1}}之一(不是标准的PHP函数)实现,例如this one

答案 1 :(得分: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

它应该被更多地测试,但在这种情况下它可以工作。

可能无效的情况是字符串中没有引号。

一,二,三,四 - &gt; onetwothreefour

编辑:更正了删除空格和相邻字母的问题。

答案 2 :(得分:0)

你可能会从错误的角度来看待它。

不是从文本中删除逗号(大概是这样你就可以在逗号上拆分字符串以获得单独的元素),如何编写适用于引号的东西?

找到开头报价后,您可以检查字符串的其余部分;下一个引用之前的任何内容都是此元素的一部分。您可以在此处添加一些检查以查找转义引号,例如:

"this is a \"quote\""

仍然可以正常阅读。

答案 3 :(得分:0)

并不是您一直在寻找的答案-但是,我已使用它来清除CSV数字中的逗号。

$csv = preg_replace('%\"([^\"]*)(,)([^\"]*)\"%i','$1$3',$csv);

“ 3,120”,123、345、567 ==> 3120、123、345、567

答案 4 :(得分:0)

嗯,我并没有偷懒,写了一个小函数来完全满足您的需求:

function clean_csv_commas($csv){
    $len = strlen($csv);
    $inside_block = FALSE;
    $out='';
    for($i=0;$i<$len;$i++){
        if($csv[$i]=='"'){
            if($inside_block){
                $inside_block=FALSE;
            }else{
                $inside_block=TRUE;
            }
        }

        if($csv[$i]==',' && $inside_block){
            // do nothing
        }else{
            $out.=$csv[$i];
        }

    }
    return $out;
}