У меня есть строка имен файлов, поступающих из API, есть 2 способа их разделения, один с запятой, а другой с запятой, затем пробел, но они не смешаны, например, см. Следующее
file name.png, filename2.png, filename3.png, filename4.png
или же
filename.png,filename.png,file name.png,filename.png
Я использовал следующий код для создания массива имен файлов до сих пор
$fileArray = preg_split( '/(\s|,|, )/', $fileList );
Но, я столкнулся с проблемой, когда, если у меня есть пробел в имени файла, он прерывает его.
Есть ли способ, которым я могу создать массив имен файлов, которые также включают пробелы в имени файла?
Я не думаю, что вам действительно нужны регулярные выражения здесь:
$fileNames = explode(',', $fileList);
$fileArray = array_map('trim', $fileNames);
Если вы позже просматриваете массив в своем коде, пропустите array_map
и обрезать имена файлов внутри вашего цикла. Это сохранит итерацию.
Если разделителями являются:
Вы можете просто запустить strpos()
проверьте и взорвитесь, используя соответствующий разделитель.
Код с 2-х тестовых прогонов 🙁демонстрация)
$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)
если это был мой проект, потому что это самый короткий, самый изысканный, буквальный метод.
Да. То, что вы хотите, это разделение запятой с или без пространство:
preg_split('/,\\s*/', $list);
Вы можете поддерживать разные разделители:
preg_split('/[;,]\\s*/', $list);
Чтобы обеспечить решение для регулярных выражений, вы должны сделать пространство необязательным токеном, используя ?
,
Следующее регулярное выражение будет работать только с запятыми или запятой, за которой следует пробел, и учитывает пробелы в неразграниченных строках.
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"}