如何分解字符串但不在 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) "]"
}
我有这个字符串:
$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) "]"
}