Php 预分离在某些条件下不分离
我有一个来自API的文件名字符串,它们有两种分隔方式,一种是用逗号分隔,另一种是用逗号和空格分隔,但它们不是混合的,例如,请参见下面的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 ); 但是,我遇到了一个问题,如果我的文件名中有一个空格,它就会把它切碎 有什么方法可
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',
)