空格的正则表达式,但不包括转义的空格。

3

我正在解析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

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

使用 PHP 函数 stat 来实现此目的。


使用 opendir()readdir() 进行“目录列表”操作。 - gnarf
事实上,情况比你想象的更糟糕,因为我正在使用PHP中的SSH连接到服务器,在另一台服务器上运行ls,然后在PHP中解析结果,最后再向用户展示... - Rich Bradshaw

1

是的,如果你正在使用 preg 函数,你可以使用 负向后行断言

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

(?<!\\\\) 会被 PHP 字符串处理成 (?<!\\),它的意思是测试白空格前面的字符不是 \


太棒了,不过当然我需要它在分割时没有加号。 (对于未来的读者!)我将在5分钟内接受。 - Rich Bradshaw

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接