Regex для пространства, но не экранированные - PullRequest
3 голосов
/ 09 сентября 2010

Я анализирую ввод 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, чтобы дать мне список с каждым полем, разделенным запятойили что-то еще лучше!)

Ответы [ 3 ]

1 голос
/ 09 сентября 2010

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

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

1 голос
/ 09 сентября 2010

Да, учитывая, что вы используете функции preg, вы можете использовать отрицательное обратное утверждение :

$filedata = preg_replace("/(?<!\\\\)\s+/", " ", $filedata);
print_r(preg_split("/(?<!\\\\)\s/", $filedata));

(?<!\\\\) обрабатывается строкой PHP как (?<!\\), что означает проверку того, что символ перед пробелом не является \

0 голосов
/ 09 сентября 2010

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

...