9
$path = '/home/to//my///site';

/上記のパスから不要なスラッシュを削除しようとしています

私はこの結果を得ようとしています

/home/to/my/site

str_replaceスラッシュの数がわからないので、失敗しました。

4

6 に答える 6

33

エレガントなソリューション

これpreg_replaceを使用すると、1行のコードでこれを取得できます。

preg_replace('#/+#','/',$str);

パターン/+はフォワードスラッシュと/1回以上一致し、単一のに置き換えられ/ます。

それほどエレガントではないソリューション

もちろん、これを実現する方法は他にもあります。たとえば、whileループを使用します。

while( strpos($path, '//') !== false ) {
   $path = str_replace('//','/',$path);
}

これはstr_replace、のすべてのオカレンス//が置き換えられるまで呼び出されます。読みやすさを犠牲にしたい場合は、そのループを1行のコードで記述することもできます(推奨されていません)。

while( strpos( ($path=str_replace('//','/',$path)), '//' ) !== false );
于 2012-09-19T12:17:44.440 に答える
12

http / httpsの後に最初の2つのスラッシュを削除せずに、URLから余分なスラッシュを削除したい場合:

$url = preg_replace('/([^:])(\/{2,})/', '$1/', $url); 

( 「PREG」または「HTACCESS」を使用してURI内の複数のスラッシュを削除する方法をツLiverboolに感謝し ます)

于 2015-04-15T10:16:44.343 に答える
4

こんにちは、これがお役に立てば幸いです

このコードを.Htaccessファイルに書き込んで確認してください。

# Prevent double slashes in URLs, e.g. //Blog and /Home//About
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

それがあなたを助けることを願っています!

于 2012-09-19T12:38:22.117 に答える
2

組み込み関数realpath()を使用して、既存のファイルのスラッシュを取り除くことができます。ただし、常に正規化された絶対パス名になります。

<?php
// 2 slashes
echo realpath('/etc//passwd') . PHP_EOL; // prints /etc/password
// 3 slashes
echo realpath('/etc///passwd') . PHP_EOL; // prints /etc/password
// 2 ..
echo realpath('/etc/../etc/passwd') . PHP_EOL; // prints /etc/password
?>

ファイルが存在しない場合、この関数はエラーを返すことに注意してください。

ドキュメントからのいくつかの重要なコメント:

realpath()は、すべてのシンボリックリンクを展開し、入力パス内の「/./」、「/../」および余分な「/」文字への参照を解決し、正規化された絶対パス名を返します。

Windowsでは、realpath()はUNIXスタイルのパスをWindowsスタイルに変更します。

于 2016-01-15T13:10:15.363 に答える
1

/と\の(連続した)オカレンスをDIRECTORY_SEPARATORにあるものに置き換え、/を処理します。と/..元気です。get_absolute_path()によって返されるパスには、位置0(文字列の先頭)または位置-1(終了)に(バック)スラッシュが含まれていません。

function get_absolute_path($path) {
    $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
    $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
    $absolutes = array();
    foreach ($parts as $part) {
        if ('.' == $part) continue;
        if ('..' == $part) {
            array_pop($absolutes);
        } else {
            $absolutes[] = $part;
        }
    }
    return implode(DIRECTORY_SEPARATOR, $absolutes);
}

テスト:

var_dump(get_absolute_path('this/is/../a/./test/.///is'));

戻り値:string(14)"this/a/test/is"

于 2016-04-21T07:31:57.933 に答える
0

while(strlen($path) != (strlen($path = str_replace('//','/', $path))));

このコードは、長さが変更される限り、ダブルスラッシュをシングルスラッシュに置き換えます。

于 2016-02-17T16:17:07.190 に答える