Php preg_replace或preg_match以及如何正确定义它

Php preg_replace或preg_match以及如何正确定义它,php,regex,preg-replace,str-replace,Php,Regex,Preg Replace,Str Replace,这是我的字符串: $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",

这是我的字符串:

$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);
有人知道我怎么解决这个问题吗?特别是“棘手的部分”(我在代码中添加了注释)


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

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

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

csv='F251,43%,“3,50欧元”,“0,50欧元”,“0,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_导出(数据);
输出:

数组(
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 €',
)
如果您想去掉
%
符号,和/或使用小数点表示数字(以便在PHP中进行进一步计算),则可以执行以下操作:

$data=array\u映射(函数($v){
//去掉值末尾的`€`或`%`:
$v=preg_replace('/(€|%)$/',''$v);
//如果要将小数点逗号替换为点以进行进一步计算,请执行以下操作:
$num=str_replace(“,”,“,”,str_replace(“,”,“,$v));
返回值为数值($num)$num:$v;
}美元数据);
var_导出(数据);
哪些产出:

数组(
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=“格式,附加费,金额,1,卡,基本价格3,50 F010F020,0%,3,50,,,”;
预匹配(“/(.*?)、(.*?)、(.*?)、(.*?)、(.*?)、(.*?)\s+(.{4})(.{4})、(.*?)、(\d+、\d\d)\s/”,
$string,$matches);
var_导出(匹配项);
这将产生:

数组(
0=>'格式,附加费,金额,1,卡,基本价格3,50 F010F020,0%,3,50',
1=>“格式”,
2=>“附加费”,
3=>“金额”,
4 => '1',
5=>“卡片”,
6=>“基本价格”,
7 => '3,50',
8=>“F010”,
9=>“F020”,
10 => '0%',
11 => '3,50',
)

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

fgetcsv
功能

您可以直接处理这些值


看看这里,这个例子很好地解释了是什么决定了F010是一个项目?可能是G999还是ä9A90?你必须在你的问题中定义这一点。你想让“卡”在数组中的“3,50”后面出现的逻辑是什么?你不可能通过替换来真正解决这种问题(即使有很多测试)。如果可能的话,最好的方法是知道每个字段应该包含哪些内容,并用捕获组以
preg\u match
模式描述整行内容。(主要思想是描述每个字段的格式)如果
preg_split
包含您的输入,您可以尝试。字符串似乎是csv的一部分,是这样吗?如果是,您确定数据类似于
,basicprice 3,50 F010F020,
?它不是在一个引用中,比如
,“basicprice 3,50 F010F020”,
。问这个问题是因为如果csv中的字段本身包含逗号,那么它通常包含在引号内。@aikn,如果使用regex拆分的preg_满足了您可能需要的所有类型的数据,那么请继续使用它。我提到了一些csv函数的使用,因为这将使您的生活更加轻松,字段之间的“,”(我知道,是一个十进制,就像在欧洲的一些地方发生的那样)对不起,我认为我在我的问题中犯了一些错误,但感谢您的回答,现在我对正则表达式的工作原理有了更好的了解。所以我得到了一个csv,看起来是这样的(但要长一些):“0,82欧元”,“F081,20%,“3,50欧元”,“3,00欧元”,“2,40欧元”,当然谢谢你:)我更新了我的答案,使用了新的信息,你在源代码中有csv数据。直接处理csv比使用正则表达式要好得多。