Регулярное выражение для пробела, но не для экранированных пробелов

Я анализирую ввод ls -lb и пытаюсь поместить каждое поле в массив в PHP.

Мой ввод выглядит примерно так:

-rwx------  1 user.name users   546879 2008-09-05 09:23 Newspaper_Templates.pdf
-rwx------  1 user.name users   403968 2009-01-12 14:16 P2_05.ppt
-rwx------  1 user.name users   144896 2009-01-12 14:08 P2.5_Using_CRO.ppt
drwx------  8 user.name users     4096 2009-09-15 10:21 School\ 09-10
drwx------  2 user.name users     4096 2010-06-28 13:59 SMART\ Notebook
drwx------  2 user.name users     4096 2009-11-30 13:35 Templates

Я просматриваю каждую строку за раз и пытаюсь заменить несколько пробелов одним пробелом, кроме тех, которые экранированы с помощью .

Каждая строка считывается в переменную с именем $filedata, а затем обрабатывается следующим образом:

    $filedata = preg_replace("/\s+/", " ", $filedata);
    print_r (preg_split("/[\s]/", $filedata));

Это почти работает, но для строк с экранированными пробелами это явно не так. Как я могу изменить это, чтобы мое разделение работало для пробелов, но не для экранированных пробелов?

(В качестве альтернативы, есть ли лучший способ? Если бы я мог заставить ls дать мне список с каждым полем, разделенным запятой или чем-то еще, это было бы еще лучше!)


person Rich Bradshaw    schedule 09.09.2010    source источник


Ответы (3)



Это очень подверженный ошибкам способ получить информацию о файле.

Для этого используйте функцию PHP stat.

person codaddict    schedule 09.09.2010
comment
И/или opendir() и readdir() для списков каталогов - person gnarf; 09.09.2010
comment
Ну, это еще хуже, чем вы думаете, потому что я использую SSH в PHP для подключения к серверу, запускаю ls, затем анализирую результаты в PHP на другом сервере, прежде чем показывать пользователю... - person Rich Bradshaw; 09.09.2010

Попробуйте с (?<!\\)\s+

person Bundyo    schedule 09.09.2010