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',
)
基于正则表达式的原始答案
您可以使用正则表达式执行此操作,但这取决于拆分其他字符串的规则。此正则表达式假定字符串将始终以相同的顺序具有相同数量的项目,并且关于 F010
和 F020
,它假定它们总是分别占据恰好 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
函数。
您可以直接处理这些值。
这是我的字符串:
$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',
)
基于正则表达式的原始答案
您可以使用正则表达式执行此操作,但这取决于拆分其他字符串的规则。此正则表达式假定字符串将始终以相同的顺序具有相同数量的项目,并且关于 F010
和 F020
,它假定它们总是分别占据恰好 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
函数。
您可以直接处理这些值。