替换部分字符串中的逗号

时间:2017-02-17 19:13:08

标签: php string preg-replace

我有一个这样的字符串:

'test', 'test', 'test, test', NULL, NULL, NULL, 123456789012, 0, '2017-02-17', FALSE

我想将它分解为数组。

但是当部分字符串包含逗号(' test,test')时,这会搞砸。

如何将部分字符串中的逗号替换为其他字符? (所以爆炸会起作用)。

必须包含字符串中的撇号,因此不能使用str_getcsv()。

3 个答案:

答案 0 :(得分:1)

您可以手动执行此操作并对其进行改进以支持更多案例...请尝试以下操作:

$arr = array();
$arr[0] = "";
$arrIndex = 0;
$strOpen = false;
for ($i = 0; $i < mb_strlen($str); $i++){
  if ($str[$i] == ',') {
    if ($strOpen == false) {
       $arrIndex++;
       $arr[$arrIndex] = "";
    }
    else {
       $arr[$arrIndex] .= $str[$i];
    }
  }
  else if ($str[$i] == '\'') {
    $strOpen = !$strOpen;
  }
  else {
    $arr[$arrIndex] .= $str[$i];
  }
}

结果:

Array
(
    [0] => test
    [1] =>  test
    [2] =>  test, test
    [3] =>  NULL
    [4] =>  NULL
    [5] =>  NULL
    [6] =>  123456789012
    [7] =>  0
    [8] =>  2017-02-17
    [9] =>  FALSE
)

注意:它将保持&#34;空&#34;昏迷的空间

答案 1 :(得分:1)

尝试使用str_getcsv

str_getcsv($string, ",", "'");

答案 2 :(得分:1)

我的方式:

$string = "'test', 'test', 'test, test, kk', NULL, NULL, NULL, 123456789012, 0, '2017-02-17', FALSE";

$array_tmp = explode(', ', $string);

$array = array();

$index_buffer = NULL;
$index = 0;
foreach($array_tmp as $value) {
    // Check if we need to append to buffered entry
    if($index_buffer !== NULL){
        $array[$index_buffer] .= ', ' . $value;
        if($value[strlen($value) - 1] === "'"){
            $index_buffer = NULL;
        }
        continue;
    }

    // Check if it's not ended string
    if(is_string($value) && $value[0] === "'"  && $value[strlen($value) - 1] !== "'"){
        // It is not ended, set this index as buffer
        $index_buffer = $index;
    }

    // Save value
    $array[$index] = $value;
    $index++;
}

echo '<pre>' . print_r($array, true);

输出:

Array
(
    [0] => 'test'
    [1] => 'test'
    [2] => 'test, test, kk'
    [3] => NULL
    [4] => NULL
    [5] => NULL
    [6] => 123456789012
    [7] => 0
    [8] => '2017-02-17'
    [9] => FALSE
)

或者这可能更合适,但你丢失引号,我想,如果你的输入字符串不尊重所有csv标准,你可能会有边框效应,因为str_getcsv处理的内容比这个引用问题更多:

str_getcsv($string, ",", "'");