将字符串修改为数组,正则表达式

时间:2016-03-24 11:22:29

标签: php regex string

我得到一个像这样的字符串:

'1': '-' '10': CustomerA; 79,00 EUR/Std '11': CustomerB; 155,00 EUR/Std '12': CustomerC; 75,00 EUR/Std '13': CustomerD; 50,00 EUR/Std '2': CustomerA; 000 EUR/Std '3': CustomerA; 000 EUR/Std '4': CustomerA; 120,00 EUR/Std '5': Customer; 75,00 EUR/Std

更好的观点:

'1': '-'
'10': CustomerA; 79,00 EUR/Std
'11': CustomerB;  155,00 EUR/Std
'12': CustomerC; 75,00 EUR/Std
'13': CustomerD; 50,00 EUR/Std
'2': CustomerA; 000 EUR/Std

尝试使用此数据获取数组:

array(
'key' => <CustomerName>; <Price> EUR/Std,
...);

我已经尝试了这个,但它只有在有文字换行时才有效..

$string = preg_split('[0-9+]', $string);
$pattern = "~^'(\d+)':\s+(.+)$~mx";

preg_match_all($pattern, $string, $matches);
$result = array_combine($matches[1], $matches[2]);

你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您可以在不拆分字符串的情况下使用此模式:

~
'\d+':      # one-or-more digits wrapped by single quotes, followed by colon
\s+         # one-or-more spaces
([^']+)     # group 1: one-or-more not-single quote char
;           # semicolon
\s+         # one-or-more spaces
(.+?)       # group 2: one-or-more character, ungreedy option
\s+         # one-or-more spaces
(EUR/\w+)   # group 3: literally “EUR/” followed by one-or-more word chars
~x

regex101 demo

小组是:

  1. 客户
  2. 价格
  3. 货币
  4. 在第1组中,我使用任何非引号字符来避免第一次空'1:'匹配。

    变体:

    1. 如果您有更多货币变体,请将(EUR/\w+)替换为(\w+/\w+)
    2. 如果/Std是可选的,请将(EUR/\w+)替换为(EUR(/\w+)?)(\w+(/\w+)?)

答案 1 :(得分:0)

谢谢你的回答。我将你的$pattern修改为:

~'(\d+)+':([^']+;\s+.+?)\s+(EUR/\w+)~x

我只需要ID和客户公司的价格。然后我使用explode函数。