0

我有一个代表目录路径的字符串。如果它是 unix 类型路径或 ms-dos 类型路径,我想拆分字符串。

如何才能做到这一点?

例如:

<?php

$a = some_path1/some_path2/some_path3; // unix type path
$b = some_path1\some_path2\some_path3; // MS-DOS type path

$foo = preg_split("something", $a); // what regex can be used here?
    // the above should work with $a OR $b

?>
4

4 回答 4

6

你的正则表达式是

preg_split('_[\\\\/]_', $a);

反斜杠为字符串转义一次,为正则表达式引擎转义一次。

编辑:

如果你知道你有什么类型的路径(例如你知道它是当前操作系统的类型)你可以这样做:

preg_split('_' . preg_quote($pathSep, '_') . '_', $a)

您可以根据需要使用常量DIRECTORY_SEPARATOR代替。$pathSep这将解决@Alan Storm 指出的问题

于 2009-07-01T15:33:15.397 回答
2

如果您尝试编写可移植代码(Linux、Windows、Mac OS 等)并且分隔符始终与服务器的分隔符相同,则可以执行以下操作:

<?php
$url = 'what/ever/';
$urlExploded = explode(DIRECTORY_SEPARATOR, $url);
?>

http://www.php.net/manual/en/dir.constants.php

于 2009-07-01T15:48:40.670 回答
0

使用管道运算符匹配正斜杠或反斜杠:

$foo = preg_split("/\\\|\//", $a);

在这个例子中,echo $foo[0]of $awill outputsome_path1echo $foo[0]of $bwill also output some_path1

编辑:$a您应该在您设置的值周围加上引号$b。否则,您的代码将触发错误。

于 2009-07-01T15:35:35.923 回答
0

首先,在我看来 preg_split 在这里有点过分了。只需使用带路径分隔符的 explode (根据 PHP 文档: http ://us2.php.net/manual/en/function.preg-split.php 更快)。

可能PHP有办法找到路径分隔符,类似于Python的os.sep,但是我没找到。但是,您可以执行以下操作:

$os = PHP_OS;
if (stristr($os, "WIN")) { $sep = '\\'; } else { $sep = '/'; } #
$pathFields = explode($sep, $pathToFile);

Note that this assumes you're only going to run this on Windows or a Unix-like system. If you might run it on some other OS with a different path separator, you'll need to do extra checks to be sure you're on a *nix system.

于 2009-07-01T16:26:50.793 回答