Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 预分离在某些条件下不分离_Php_Preg Split_Delimited Text - Fatal编程技术网

Php 预分离在某些条件下不分离

Php 预分离在某些条件下不分离,php,preg-split,delimited-text,Php,Preg Split,Delimited Text,我有一个来自API的文件名字符串,它们有两种分隔方式,一种是用逗号分隔,另一种是用逗号和空格分隔,但它们不是混合的,例如,请参见下面的 file name.png, filename2.png, filename3.png, filename4.png 或 到目前为止,我一直在使用以下代码创建一个文件名数组 $fileArray = preg_split( '/(\s|,|, )/', $fileList ); 但是,我遇到了一个问题,如果我的文件名中有一个空格,它就会把它切碎 有什么方法可

我有一个来自API的文件名字符串,它们有两种分隔方式,一种是用逗号分隔,另一种是用逗号和空格分隔,但它们不是混合的,例如,请参见下面的

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

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

$fileArray = preg_split( '/(\s|,|, )/', $fileList );
但是,我遇到了一个问题,如果我的文件名中有一个空格,它就会把它切碎


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

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

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

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

是。您需要的是逗号之间的分隔,可以带空格,也可以不带空格:

preg_split('/,\\s*/', $list);
您可以支持不同的分隔符:

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

要提供正则表达式解决方案,您可以利用
将空间作为可选标记。 下面的正则表达式只能使用逗号,或者逗号后跟空格,并且允许在非分隔字符串中使用空格

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

如果分隔符为:

  • 所有逗号分隔或
  • 所有逗号空格分隔
  • 您只需运行
    strpos()
    检查并使用适当的分隔符分解即可

    具有2次测试运行的代码:()

    输出:

    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)
    ,因为这是最短、最精细的文本方法。

    是否允许从字符串中的文件名中删除空格?如果是这样,您可以使用
    trim()
    ,然后只需检查逗号即可。否则,您将需要一个相当复杂的正则表达式。@obsidiange嘿,我无法修改字符串的输出,不幸的是“还有一个先有空格,然后是逗号”,但您的示例显示的是逗号,然后是空格,是哪个?分隔符是否可以选择逗号后跟空格?@salathe抱歉,我的错,我已经更新了问题。在这种情况下,您的正则表达式可以是
    /,?/
    (即逗号后跟零或一个空格)。啊,现在我为什么没有想到这个。。。我想我太沉迷于分裂前的世界了。。。多谢各位much@BigJobbies发生在我们当中最好的人身上:)你为什么要逃避空白字符?为什么要写一个模式来包含不存在的分隔符呢?空格是PCRE的,但是它本身需要转义。\s和\\s都有效,因为\s将是非法转义,但我觉得\\s更一致。我添加了一个可能的额外分隔符,因为它可能对其他人有用。如果我不这么认为,我也可以在另一个答案被接受时删除我的任何未被接受的答案。@LSerni我必须查找
    \\s
    的用法,因为我自己从未使用过它,同样的PCRE语法适用于斜杠。e、 g./=,这是由于PHP读取字符串中斜杠的方式。我们的答案几乎相同(除了多个分隔符),其中
    \s?
    是可选的单个空白,而
    \s*
    表示0或更多。在数据格式错误的情况下,这可能被认为是错误的。e、 g.
    ,\s\s
    从技术上讲,我会使用
    \040
    /
    作为文字空格字符,但我在回答中使用了
    \s
    ,因为它比
    \040
    更广为人知,比
    //code>更易读。这正是此函数的用途。正则表达式被合理地用于避免编写复杂和/或其他不必要的复杂方法。利用这些信息,我们有两种格式中的任何一种,这是唯一的答案。为什么不直接使用
    explode(',',$filename)
    而只使用
    trim
    。@Bluetree,因为这样效率较低。您将迭代每个元素并每次调用trim()。@如果有多个空格
    ?在这种情况下,您将创建另一个不好的条件。使用
    trim()
    是更好的选择。这超出了本页/问题的范围。OP明确定义了只有两种类型的分隔符。如果它更可变,我会越来越倾向于正则表达式——因为这就是它的用途。如果其中一个文件名以空格开头,我的方法将不会损坏它,
    trim()
    会损坏它(如果我们戴上锡箔帽并生成虚构的边缘盒)。我对正则表达式的掌握比一般人好。我知道如果我们匹配文字空格,那么``是合适的,如果我们也匹配制表符和换行符,那么
    \s
    更好。我知道量词。
    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"
    }
    
    $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',
    )