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);

バックスラッシュは、文字列に対して 1 回エスケープされ、正規表現エンジンに対して再度エスケープされます。

編集:

取得したパスのタイプがわかっている場合 (たとえば、現在の OS のタイプであることがわかっている場合)、次のことができます。

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

まず、ここでは preg_split がやり過ぎのように思えます。パスセパレーターで爆発を使用するだけです(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 系のシステムでのみ実行することを想定していることに注意してください。別のパス区切り文字を使用して他の OS で実行する可能性がある場合は、* nix システムであることを確認するために追加のチェックを行う必要があります。

于 2009-07-01T16:26:50.793 に答える
0

パイプ演算子を使用して、スラッシュまたはバックスラッシュのいずれかに一致させます。

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

この例では、echo $foo[0]of$aが出力some_path1し、echo $foo[0]of$bも を出力しますsome_path1

編集:$a設定した値を引用符で囲む必要があります$b。そうしないと、コードでエラーが発生します。

于 2009-07-01T15:35:35.923 に答える