preg_split 在某些条件下不分离

preg_split not separating under certain conditions

我有一串来自 API 的文件名,它们有两种分隔方式,一种用逗号,另一种用逗号然后 space 但它们没有混合,例如看下面

file name.png, filename2.png, filename3.png, filename4.png

filename.png,filename.png,file name.png,filename.png

到目前为止,我一直在使用以下代码创建文件名数组

$fileArray = preg_split( '/(\s|,|, )/', $fileList );

但是,我 运行 遇到了一个问题,如果我在文件名中有一个 space,它会把它砍掉。

有什么方法可以创建一个文件名数组,文件名中还包含 spaces 吗?

我不认为你真的需要这里的正则表达式:

$fileNames = explode(',', $fileList);
$fileArray = array_map('trim', $fileNames);

如果稍后在代码中循环遍历数组,请跳过循环中的 array_map 和 trim 文件名。这将节省一次迭代。

是的。你想要的是逗号分隔 with or without a space:

preg_split('/,\s*/', $list);

您可以支持不同的分隔符:

preg_split('/[;,]\s*/', $list);

要提供正则表达式解决方案,您可以使用 ? 使 space 成为可选标记。 以下正则表达式仅适用于逗号,或逗号后跟 space,并允许在非分隔字符串中使用 space。

preg_split('/,\s?/', $string);

结果:https://3v4l.org/j87Qs

array(5) {
  [0]=>
  string(12) "filename.png"
  [1]=>
  string(12) "filename.png"
  [2]=>
  string(12) "filename.png"
  [3]=>
  string(12) "filename.png"
  [4]=>
  string(13) "file name.png"
}
array(5) {
  [0]=>
  string(12) "filename.png"
  [1]=>
  string(13) "filename2.png"
  [2]=>
  string(13) "filename3.png"
  [3]=>
  string(13) "filename4.png"
  [4]=>
  string(14) "file name5.png"
}

如果分隔符是:

  1. 所有逗号分隔或
  2. 所有逗号-space-分隔

您可以 运行 一个 strpos() 检查并使用适当的分隔符展开。

带有 2 个测试的代码 运行s: (Demo)

$fileLists=[
    'filename.png,file name2.png,filename3.png,filename4.png',
    'filename5.png, filename6.png, file name7.png, filename8.png'
];
foreach($fileLists as $fileList){
    var_export(explode(strpos($fileList,', ')!==false?", ":",",$fileList));
}

输出:

array (
  0 => 'filename.png',
  1 => 'file name2.png',
  2 => 'filename3.png',
  3 => 'filename4.png',
)array (
  0 => 'filename5.png',
  1 => 'filename6.png',
  2 => 'file name7.png',
  3 => 'filename8.png',
)

这意味着没有迭代函数调用 modify/clean 每个元素)。

...但老实说,如果这是我的项目,我会使用 preg_split('/, ?/',$fileList),因为这是最短、最精炼的文字方法。