正则表达空间,但不是空间

时间:2010-09-09 16:50:28

标签: php regex preg-replace preg-split file-listing

我正在解析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 个答案:

答案 0 :(得分:1)

这是一种非常容易出错的方式来获取文件信息。

为此目的使用PHP函数stat

答案 1 :(得分:1)

是的,鉴于您使用的是preg功能,您可以使用negative look-behind assertion

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

(?<!\\\\)被PHP字符串处理为(?<!\\),这意味着测试空格前的字符不是\

答案 2 :(得分:0)

尝试使用(?<!\\)\s+