$path = '/home/to//my///site';
/
上記のパスから不要なスラッシュを削除しようとしています
私はこの結果を得ようとしています
/home/to/my/site
str_replace
スラッシュの数がわからないので、失敗しました。
$path = '/home/to//my///site';
/
上記のパスから不要なスラッシュを削除しようとしています
私はこの結果を得ようとしています
/home/to/my/site
str_replace
スラッシュの数がわからないので、失敗しました。
これ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 );
http / httpsの後に最初の2つのスラッシュを削除せずに、URLから余分なスラッシュを削除したい場合:
$url = preg_replace('/([^:])(\/{2,})/', '$1/', $url);
( 「PREG」または「HTACCESS」を使用してURI内の複数のスラッシュを削除する方法をツLiverboolに感謝し ます)
こんにちは、これがお役に立てば幸いです
このコードを.Htaccessファイルに書き込んで確認してください。
# Prevent double slashes in URLs, e.g. //Blog and /Home//About
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
それがあなたを助けることを願っています!
組み込み関数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スタイルに変更します。
/と\の(連続した)オカレンスを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"
while(strlen($path) != (strlen($path = str_replace('//','/', $path))));
このコードは、長さが変更される限り、ダブルスラッシュをシングルスラッシュに置き換えます。