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);
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"
}
如果分隔符是:
- 所有逗号分隔或
- 所有逗号-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)
,因为这是最短、最精炼的文字方法。
我有一串来自 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);
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"
}
如果分隔符是:
- 所有逗号分隔或
- 所有逗号-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)
,因为这是最短、最精炼的文字方法。