如何分解字符串但不在 php 中的引号内?

How to explode a string but not within quotes in php?

我有这个字符串:

$sc = '[csvtohtml_create include_rows="1-10" 
debug_mode="no" source_type="guess" path="largecsv" 
source_files="FL_insurance_sample - Kopia.csv2"  csv_delimiter="," ]'

我正在尝试弄清楚如何分隔由 space 分隔的值。这本身不是问题,但是 如果 space 在引号内,我不希望它被分开 .


仔细看看下面的 source_files。 (我希望数组中的项目是"FL_insurance_sample - Kopia.csv2"

搭配:

$args = explode( '=', $sc );

我得到这个结果:

array (size=11)
  0 => string '[csvtohtml_create' (length=17)
  1 => string 'include_rows="1-10"' (length=19)
  2 => string 'debug_mode="no"' (length=15)
  3 => string 'source_type="guess"' (length=19)
  4 => string 'path="largecsv"' (length=15)
  5 => string 'source_files="FL_insurance_sample' (length=33)
  6 => string '-' (length=1)
  7 => string 'Kopia.csv2"' (length=11)
  8 => string '' (length=0)
  9 => string 'csv_delimiter=","' (length=17)
  10 => string ']' (length=1)

我想要的结果是:

array (size=11)
  0 => string '[csvtohtml_create' (length=17)
  1 => string 'include_rows="1-10"' (length=19)
  2 => string 'debug_mode="no"' (length=15)
  3 => string 'source_type="guess"' (length=19)
  4 => string 'path="largecsv"' (length=15)
  5 => string 'source_files="FL_insurance_sample - Kopia.csv2"' (length=42)
  7 => string 'csv_delimiter=","' (length=17)
  8 => string ']' (length=1)

我一直在寻找类似的问题,但我不确定答案是否就是我正在寻找的答案。请把我放在正确的方向。 preg_split 是我需要的吗?

不使用 explode,一种选择是使用 preg_split

(请注意,在您想要的结果中,数组的大小应为 array(8) 并且您跳过了第 6 个键)

模式匹配

  • "[^"]+" 使用否定字符匹配 "..." class
  • (*SKIP)(*F)当前匹配的不应该是结果的一部分
  • |
  • \h+ 匹配 1 个或多个水平空白字符

例子

$sc = '[csvtohtml_create include_rows="1-10" debug_mode="no" source_type="guess" path="largecsv" source_files="FL_insurance_sample - Kopia.csv2"  csv_delimiter="," ]';

var_dump(preg_split('/"[^"]+"(*SKIP)(*F)|\h+/', $sc));

输出

array(8) {
  [0]=>
  string(17) "[csvtohtml_create"
  [1]=>
  string(19) "include_rows="1-10""
  [2]=>
  string(15) "debug_mode="no""
  [3]=>
  string(19) "source_type="guess""
  [4]=>
  string(15) "path="largecsv""
  [5]=>
  string(47) "source_files="FL_insurance_sample - Kopia.csv2""
  [6]=>
  string(17) "csv_delimiter=",""
  [7]=>
  string(1) "]"
}