【发布时间】:2016-05-23 20:58:43
【问题描述】:
这是我的字符串:
$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);
有人知道我该如何解决这个问题吗?尤其是“棘手的部分”(我在代码中添加了注释)
如果有人能回答会很好:)
【问题讨论】:
-
什么决定了F010是一个项目?是G999还是ä9A90?你必须在你的问题中定义这个。您希望 "card" 以什么逻辑出现在 "3,50" 数组中?
-
您无法通过替换(即使进行大量测试)来真正解决此类问题。如果可能的话,最好的方法是知道每个字段应该包含什么,并用捕获组以
preg_match的模式描述整行。 (主要思想是描述每个字段的格式) -
您可以尝试
preg_split和regex like this 是否会覆盖您的输入。 Here's a demo at eval.in -
似乎该字符串是某些 csv 的一部分,是这样吗?如果是,您确定数据类似于
,basicprice 3,50 F010F020,吗?它不是像,"basicprice 3,50 F010F020",这样的引用本身吗?问这个是因为如果 csv 中的字段本身包含逗号,那么它通常在引号内。 -
@aikn,如果带有正则表达式的 preg_split 可以满足您可能拥有的所有类型数据的需求,那么请继续使用它。我提到了一些 csv 函数的使用,因为这将使您的生活更轻松,因为在字段之间出现的“,”(我知道 , 是一个小数,就像在欧洲的某些地方发生的那样)
标签: php regex preg-replace str-replace