preg_split在某些条件下不分离

时间:2017-11-21 23:47:31

标签: php preg-split delimited-text

我有一个来自API的文件名字符串,它们有两种分隔方式,一种是逗号,另一种是逗号然后是空格,但它们没有混合,例如请参阅以下内容

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

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

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

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

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

有什么方法可以创建一个文件名数组,其中还包含文件名中的空格?

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

如果分隔符是:

  1. 所有逗号分隔或
  2. 所有逗号空格分隔
  3. 您只需运行strpos()检查并使用相应的分隔符进行爆炸。

    包含2次测试运行的代码:(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',
    )
    

    这意味着没有迭代函数调用来修改/清理每个元素。)

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

答案 2 :(得分:1)

是。你想要的是将逗号分隔为有或没有空格:

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

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

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

答案 3 :(得分:1)

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

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"
}