以下是我试图解析的数据:
50‐59 1High300.00 Avg300.00
90‐99 11High222.00 Avg188.73
120‐1293High204.00 Avg169.33
第一部分是重量范围,接下来是计数,其次是 Highprice ,以 Avgprice
作为一个例子,我需要将上面的数据解析成一个看起来像
的数组[0]50-59
[1]1
[2]High300.00
[3]Avg300.00
[0]90-99
[1]11
[2]High222.00
[3]Avg188.73
[0]120‐129
[1]3
[2]High204.00
[3]Avg169.33
我考虑过创建一个可能的权重范围的数组,但我无法弄清楚如何使用数组的值来分割字符串。
$arr = array("10-19","20-29","30-39","40-49","50-59","60-69","70-79","80-89","90-99","100-109","110-119","120-129","130-139","140-149","150-159","160-169","170-179","180-189","190-199","200-209","210-219","220-229","230-239","240-249","250-259","260-269","270-279","280-289","290-299","300-309");
非常感谢任何想法。
答案 0 :(得分:1)
希望这会奏效:
$string='50-59 1High300.00 Avg300.00
90-99 11High222.00 Avg188.73
120-129 3High204.00 Avg169.33';
$requiredData=array();
$dataArray=explode("\n",$string);
$counter=0;
foreach($dataArray as $data)
{
if(preg_match('#^([\d]+\-[\d]+) ([\d]+)([a-zA-Z]+[\d\.]+) ([a-zA-Z]+[\d\.]+)#', $data,$matches))
{
$requiredData[$counter][]=$matches[1];
$requiredData[$counter][]=$matches[2];
$requiredData[$counter][]=$matches[3];
$requiredData[$counter][]=$matches[4];
$counter++;
}
}
print_r($requiredData);
答案 1 :(得分:1)
'#^([\d]+\-[\d]+) ([\d]+)([a-zA-Z]+[\d\.]+) ([a-zA-Z]+[\d\.]+)#'
我认为这不会起作用,因为你在正则表达式中有空间 重量和数量之间。我正在努力的事情是一排 像这样没有空间的地方。
一样进行解析120‐1293High204.00 Avg169.33
那个 需要像[0]120‐129 [1]3 [2]High204.00 [3]Avg169.33
你是对的。这可以通过将重量位数限制为3并使空格可选来解决。
'#^(\d+-\d{1,3}) *…
答案 2 :(得分:0)
$arr = array('50-59 1High300.00 Avg300.00',
'90-99 11High222.00 Avg188.73',
'120-129 3High204.00 Avg169.33');
foreach($arr as $str) {
if (preg_match('/^(\d+-\d{1,3})\s*(\d+)(High\d+\.\d\d) (Avg\d+\.\d\d)/i', $str, $m)) {
array_shift($m); //remove group 0 (ie. the whole match)
$result[] = $m;
}
}
print_r($result);
<强>输出:强>
Array
(
[0] => Array
(
[0] => 50-59
[1] => 1
[2] => High300.00
[3] => Avg300.00
)
[1] => Array
(
[0] => 90-99
[1] => 11
[2] => High222.00
[3] => Avg188.73
)
[2] => Array
(
[0] => 120-129
[1] => 3
[2] => High204.00
[3] => Avg169.33
)
)
<强>解释强>
/ : regex delimiter
^ : begining of string
( : start group 1
\d+-\d{1,3} : 1 or more digits a dash and 1 upto 3 digits ie. weight range
) : end group 1
\s* : 0 or more space character
(\d+) : group 2 ie. count
(High\d+\.\d\d) : group 3 literal High followed by price
(Avg\d+\.\d\d) : Group 4 literal Avg followed by price
/i : regex delimiter and case Insensitive modifier.
为了更通用,您可以将High
和Avg
替换为[a-z]+
答案 3 :(得分:0)
让我们对这个看似遗弃的问题得到一些解决方案:
这是您可以信任的模式(Pattern Demo):
^((\d{0,2})0\‐(?:\2)9) ?(\d{1,3})High(\d{1,3}\.\d{2}) ?Avg(\d{1,3}\.\d{2})
其他答案忽略了weight range
子字符串中的数字模式。范围起始整数始终以0
结尾,范围结束整数始终以9
结尾;范围总是跨越十个整数。
我的模式将捕获起始整数中0
之前的数字,并在短划线后立即引用它们,然后要求捕获的数字后跟9
。
我想指出您的示例输入有点棘手,因为‐
不是我-
和0
之间的标准=
键盘。这对我来说是一个偷偷摸摸的小问题。
方法(Demo):
$keys=['weight range','count','Highprice','Avgprice'];
$in='50‐59 1High300.00 Avg300.00
90‐99 11High222.00Avg188.73
120‐1293High204.00 Avg169.33';
$out=preg_match_all('/((\d{0,2})0\‐(?:\2)9) ?(\d{1,3})High(\d{1,3}\.\d{2}) ?Avg(\d{1,3}\.\d{2})/',$in,$out)?array_diff_key($out,[0=>'',2=>'']):[];
// array_diff_key removes unwanted matching subarrays
foreach($out as $i=>$v){
$result[]=array_combine($keys,array_column($out,0));
}
var_export($result);
输出:
array (
0 =>
array (
'weight range' => '50‐59',
'count' => '1',
'Highprice' => '300.00',
'Avgprice' => '300.00',
),
1 =>
array (
'weight range' => '50‐59',
'count' => '1',
'Highprice' => '300.00',
'Avgprice' => '300.00',
),
2 =>
array (
'weight range' => '50‐59',
'count' => '1',
'Highprice' => '300.00',
'Avgprice' => '300.00',
),
3 =>
array (
'weight range' => '50‐59',
'count' => '1',
'Highprice' => '300.00',
'Avgprice' => '300.00',
),
)