将字符串分解为元素

时间:2014-11-29 14:09:17

标签: php string csv delimiter explode

我需要explode()这个

  

'194','??','Dot,is',“3”,“0”,'4','35',0,'ANIMAL','STUN,SLOW,CURSE,TERROR'

分成元素。

元素的内容可以是引号或撇号(但可能根本不引用)。

零宽度字符串也需要匹配。

正如您所看到的,我无法用逗号分解它,因为逗号包含在某些元素中。

元素之间缺少空格,元素本身可能包含空格。

结果应为

元素0 = 194
元素1 = ??
元素2 =点,是
要素3 = 3
元素4 = 0
元素5 = 4
要素6 = 35
要素7 =
元素8 = 0
元素9 =动物
元素10 = STUN,SLOW,CURSE,TERROR

2 个答案:

答案 0 :(得分:3)

使用str_replace()'转换为";然后使用str_getcsv()

$str = "'194', '??','Dot, is', \"3\",\"0\", '4', '35',, 0, 'ANIMAL','STUN,SLOW,CURSE,TERROR'";

$array = str_getcsv(
    str_replace("'", '"', $str)
);

var_dump($array);

答案 1 :(得分:0)

这是1函数调用/正则表达式方式,没有捕获组,也没有字符串准备...

代码:(Demo)(Pattern Demo

// Using HEREDOC syntax to avoid escaping quotes in $string and $pattern
$string=<<<EOD
'194', '??','Dot, is', "3","0", '4', '35',, 0, 'ANIMAL','STUN,SLOW,CURSE,TERROR'
EOD;

$pattern=<<<EOD
/(?:^|,)(?: *(?:'\K[^']*|"\K[^"]*|\K[^,]+|\K(?=,)))/
EOD;

var_export(preg_match_all($pattern,$string,$out)?$out[0]:'fail');

输出:

array (
  0 => '194',
  1 => '??',
  2 => 'Dot, is',
  3 => '3',
  4 => '0',
  5 => '4',
  6 => '35',
  7 => '',
  8 => '0',
  9 => 'ANIMAL',
  10 => 'STUN,SLOW,CURSE,TERROR',
)

有4种类型的匹配项。我将按照我的模式替代品的顺序列出它们。

  • 单引号包装子串
  • 双引号包裹的子串
  • 没有报价包装正宽度子串
  • 没有报价包装零宽度子串

注意:\K重置全字符串匹配 - 这允许省略捕获组并允许输出数组将所有匹配放在单个子数组[0]中。