【问题标题】:PHP double quote gets trimmed even when I tell it not to即使我告诉它不要修剪PHP双引号
【发布时间】:2017-01-03 16:59:20
【问题描述】:

我在实用程序类上创建了一个通用函数,它将逗号分隔的字符串转换为数组。该函数有一个关于修剪内容的可选参数,但默认修剪空格和引号(单引号和双引号)。

public function convertToArray($string, $trim = " '\"") {
    $split = array();

    if(!empty($string)) {
        $split = str_getcsv($string, ",");

        if(!empty($trim)) {
            $split = array_map(function($split) use ($trim) {
                return trim($split, $trim);
            }, $split);
        }
    }

    echo var_dump($string);
    echo var_dump($trim);
    echo var_dump($split);

    return $split;
}

在一个单独的文件上,我这样称呼它(我只想修剪空格并保持引号不变):

$utility->convertToArray($keywords, " ");

3var_dump 的输出如下:

$字符串

string(21) "Finance, "Accounting""

$修剪

string(1) " "

$拆分

array(2) {
  [0]=>
  string(7) "Finance"
  [1]=>
  string(10) "Accounting"
}

我希望得到string(12) ""Accounting"",但不知何故,双引号被修剪了。该函数适用于单引号,但因为我得到string(12) "'Accounting'"

附加信息

我使用 str_getcsv 是因为这些值中可能包含逗号并且不应拆分。

【问题讨论】:

  • 出于好奇:为什么不使用explode,而不是$split = str_getcsv($string, ",");
  • 你看过 str_getcsv 是做什么的吗?因为 csv 可以在其中包含不属于数据的引号。
  • $split = str_getcsv($string, ","); 是默认修剪双引号
  • 好的,感谢您指出这一点!最初我使用的是explode,但由于我忘记的原因,我不得不将其更改为str_getcsv。最终我的要求发生了变化,我忘记将其恢复为explode。这是我的相关问题stackoverflow.com/questions/41286693/…
  • @yivi 你是对的。事实上,我们根本不知道规格:)

标签: php string csv trim double-quotes


【解决方案1】:

碰巧str_getcsv() 已经删除了引号:

$s = 'hello,"world"';
var_dump(str_getcsv($s, ','));

# array(2) {
#   [0] => string(2) "Hello"
#   [1] => string(5) "world"
# }

您可以改用explode()

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

【讨论】:

  • 有没有办法让我继续使用str_getcsv 而不是explode,因为我的值中也有逗号。
  • @uom-pgregorio 据我所知,使用此功能是不可能的。这里的问题在于整个 CSV 规范。老实说,我的建议是,如果您需要处理逗号和引号很重要的数据,请使用更好的格式。当然,让这种当前的方式发挥作用是可能的,它总是有可能的,只是取决于你想要付出的努力。而且感觉要解决问题的副作用而不是其原因需要付出太多努力
  • 正则表达式怎么样?我对此持开放态度,但我不擅长正则表达式。
  • @uom-pgregorio 查看这个问题:stackoverflow.com/questions/16476744/…
【解决方案2】:

使用explode 代替str_getcsv

我认为这会解决你的麻烦。

str_getcsv 会将引号视为特殊的“包围”分隔符,并自行删除它们。

explode 是你的朋友。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多