希望这很简单。我有一个数组,其中的行包含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
?>
非常感谢大家。
答案 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;
}