preg_replace 或 preg_match 我该如何正确定义它

preg_replace or preg_match and how can i define it right

这是我的字符串:

$string =  "format,surcharge,amount,1,card,basicprice 3,50  F010F020,0%,3,50 ,,,";

我想要一个应该如下所示的数组:

array(
    0 => "format",
    1 => "surcharge",
    2 => "amount",
    3 => "1",
    4 => "card",
    5 => "basicprice",
    6 => "3,50",          //<-- tricky part, i complete don't get how i can solve this
    7 => "card",
    8 => "F010",          //<-- tricky part, i complete don't get how i can solve this   
    9 => "F020",          //<-- tricky part, i complete don't get how i can solve this
    10 => "3,50",
);

所以我的尝试是这样的:

$string =  "Format,Aufpreis,Anzahl,1,Card,Basispreis 3,50  F010F020,0%,3,50 ,,,,,,";
$regEx = '/,/';
$replace = ' ';
$perfectArray = preg_replace('/,/', $replace, $string2);
var_dump($perfectArray);

或者像这样

$array = str_split($string);

$from = array(",", '"');
$to = array(" ", " ");

    foreach ($array as $value)
    {
        $value = str_replace($from, $to, $string);
    }
    var_dump($value);

有人知道我该如何解决这个问题吗?特别是 "tricky part"(我在代码中添加了注释)

如果有人能回答就太好了:)

您在评论中提到您有 CSV 格式的原始数据后,使用正则表达式并不是最好的解决方案。

而是使用 PHP 的 CSV 函数将数据拆分为一个数组,例如 str_getcsv:

$csv = 'F251,43%,"3,50 €","0,50 €","0,50 €",,"0,50 €","0,50 €","0,50 €","0,49 €",
        "0,49 €",,"0,47 €",,"0,47 €",,"0,46 €","0,46 €","0,44 €","0,44 €","0,44 €",,
        "0,43 €",,"0,43 €","0,43 €",,,"0,41 €",,,"0,40 €","0,40 €",,"0,39 €",
        "0,39 €",,"0,37 €","0,37 €","0,36 €","0,36 €","0,36 €","0,36 €","0,36 €"';

$data = str_getcsv($csv);

var_export ($data);

输出:

array (
  0 => 'F251',
  1 => '43%',
  2 => '3,50 €',
  3 => '0,50 €',
  4 => '0,50 €',
  5 => '',
  6 => '0,50 €',
  7 => '0,50 €',
  8 => '0,50 €',
  9 => '0,49 €',
  10 => '0,49 €',
  11 => '',
  12 => '0,47 €',
  13 => '',
  14 => '0,47 €',
  15 => '',
  16 => '0,46 €',
  17 => '0,46 €',
  18 => '0,44 €',
  19 => '0,44 €',
  20 => '0,44 €',
  21 => '',
  22 => '0,43 €',
  23 => '',
  24 => '0,43 €',
  25 => '0,43 €',
  26 => '',
  27 => '',
  28 => '0,41 €',
  29 => '',
  30 => '',
  31 => '0,40 €',
  32 => '0,40 €',
  33 => '',
  34 => '0,39 €',
  35 => '0,39 €',
  36 => '',
  37 => '0,37 €',
  38 => '0,37 €',
  39 => '0,36 €',
  40 => '0,36 €',
  41 => '0,36 €',
  42 => '0,36 €',
  43 => '0,36 €',
)

如果您想去掉 % 符号,and/or 对数字使用小数点(以便在 PHP 中进行进一步计算) ,那么你可以这样做:

$data = array_map(function ($v) { 
    // get rid of `€` or `%` at the end of values:
    $v = preg_replace('/( €|%)$/', '', $v);
    // if you want to replace the decimal comma to point for further calculations:
    $num = str_replace(',', '.', str_replace('.', '', $v));
    return is_numeric($num) ? $num : $v;
}, $data);

var_export ($data);

输出:

array (
  0 => 'F251',
  1 => '43',
  2 => '3.50',
  3 => '0.50',
  4 => '0.50',
  5 => '',
  6 => '0.50',
  7 => '0.50',
  8 => '0.50',
  9 => '0.49',
  10 => '0.49',
  11 => '',
  12 => '0.47',
  13 => '',
  14 => '0.47',
  15 => '',
  16 => '0.46',
  17 => '0.46',
  18 => '0.44',
  19 => '0.44',
  20 => '0.44',
  21 => '',
  22 => '0.43',
  23 => '',
  24 => '0.43',
  25 => '0.43',
  26 => '',
  27 => '',
  28 => '0.41',
  29 => '',
  30 => '',
  31 => '0.40',
  32 => '0.40',
  33 => '',
  34 => '0.39',
  35 => '0.39',
  36 => '',
  37 => '0.37',
  38 => '0.37',
  39 => '0.36',
  40 => '0.36',
  41 => '0.36',
  42 => '0.36',
  43 => '0.36',
)

基于正则表达式的原始答案

您可以使用正则表达式执行此操作,但这取决于拆分其他字符串的规则。此正则表达式假定字符串将始终以相同的顺序具有相同数量的项目,并且关于 F010F020,它假定它们总是分别占据恰好 4 个字符并且始终存在:

$string = "format,surcharge,amount,1,card,basicprice 3,50  F010F020,0%,3,50 ,,,";

preg_match("/(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)\s+(.*?)\s+(.{4})(.{4}),(.*?),(\d+,\d\d)\s/",
    $string, $matches);

var_export ($matches);

这输出:

array (
  0 => 'format,surcharge,amount,1,card,basicprice 3,50  F010F020,0%,3,50 ',
  1 => 'format',
  2 => 'surcharge',
  3 => 'amount',
  4 => '1',
  5 => 'card',
  6 => 'basicprice',
  7 => '3,50',
  8 => 'F010',
  9 => 'F020',
  10 => '0%',
  11 => '3,50',
)

如您评论中所述,如果这是来自 csv,请尝试使用

fgetcsv 函数。

您可以直接处理这些值。

看这里http://php.net/manual/en/function.fgetcsv.php,例子解释的很好