【问题标题】:Explode string to elements将字符串分解为元素
【发布时间】:2015-01-27 23:15:49
【问题描述】:

我需要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 = 眩晕、缓慢、诅咒、恐怖

【问题讨论】:

  • str_getcsv() 在这种情况下可能比爆炸更好
  • 虽然你真的有单引号和双引号的混合体吗?
  • 嗯,我已经让它变得简单了很多......当前的字符串要大得多,是的,它有时有“文本”,有时有“文本”,有时只是文本
  • 在这种情况下,使用str_replace()' 转换为";然后使用str_getcsv()

标签: php string csv delimiter explode


【解决方案1】:

使用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);

【讨论】:

  • 即使对于没有任何附件的值,这也能工作吗?
  • 包围是可选的,仅当值实际包含分隔符时才需要,但在使用时需要保持一致
【解决方案2】:

这是没有捕获组和字符串准备的 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] 中的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    相关资源
    最近更新 更多