preg_split не разделяется при определенных условиях

У меня есть строка имен файлов, поступающих из 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 );

Но, я столкнулся с проблемой, когда, если у меня есть пробел в имени файла, он прерывает его.

Есть ли способ, которым я могу создать массив имен файлов, которые также включают пробелы в имени файла?

0

Решение

Я не думаю, что вам действительно нужны регулярные выражения здесь:

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

Если вы позже просматриваете массив в своем коде, пропустите array_map и обрезать имена файлов внутри вашего цикла. Это сохранит итерацию.

4

Другие решения

Если разделителями являются:

  1. Все запятые или
  2. Все разделены запятыми

Вы можете просто запустить 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) если это был мой проект, потому что это самый короткий, самый изысканный, буквальный метод.

2

Да. То, что вы хотите, это разделение запятой с или без пространство:

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

Вы можете поддерживать разные разделители:

preg_split('/[;,]\\s*/', $list);
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"}
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector