【问题标题】:How can I split a string if it is a MS-DOS type path OR Unix type path?如果它是 MS-DOS 类型路径或 Unix 类型路径,我如何拆分字符串?
【发布时间】:2009-07-01 15:29:25
【问题描述】:

我有一个代表目录路径的字符串。如果它是 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

?>

【问题讨论】:

    标签: php regex unix split dos


    【解决方案1】:

    你的正则表达式是

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

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

    编辑:

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

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

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

    【讨论】:

    • 如果 unix 文件名实际上有一个反斜杠,那将会窒息(反斜杠在 unix 中是一个不常见但合法的文件字符)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      在本例中,$aecho $foo[0] 将输出 some_path1$becho $foo[0] 也将输出 some_path1

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

      【讨论】:

      • 在反斜杠、正斜杠、管道上分割。我想你的意思是preg_split("/\\\\|/", $a);(也就是说,不是[])。
      【解决方案4】:

      首先,在我看来 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);
      

      请注意,这假设您只打算在 Windows 或类 Unix 系统上运行它。如果您可能在其他具有不同路径分隔符的操作系统上运行它,则需要进行额外检查以确保您在 *nix 系统上。

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-12
        • 2020-10-21
        • 1970-01-01
        相关资源
        最近更新 更多