Удалите ненужные косые черты с пути

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

Я пытаюсь удалить ненужные косые черты / из пути выше

Я пытаюсь получить эти результаты

 /home/to/my/site 

Я потерпел неудачу с str_replace , так как я не знаю количество косых черт.

Элегантное решение

С preg_replace вы можете получить это с помощью одной строки кода:

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

Шаблон /+ будет соответствовать forwardlash / один или несколько раз и заменит его на один / .

Не очень элегантное решение

Конечно, есть и другие способы достичь этого, например, используя цикл while.

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

Это вызовет str_replace пока не будут str_replace все вхождения // . Вы также можете написать этот цикл в одной строке кода, если хотите пожертвовать читабельностью (не рекомендуется).

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

если кто-то хочет удалить лишние косые черты из URL-адреса без удаления первых двух косых черт после http / https:

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

(спасибо ツ Liverbool, как удалить несколько слэшей в URI с помощью «PREG» или «HTACCESS» )

Привет, это поможет

Напишите этот код в файле .Htaccess и проверьте его.

 # Prevent double slashes in URLs, eg //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 () расширяет все символические ссылки и разрешает ссылки на символы «/ ./», «/../» и дополнительные символы «/» в пути ввода и возвращает каноническое абсолютное имя пути.

А также

В окнах realpath () изменяет стили стиля unix на стиль Windows.

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

Этот код заменяет двойные косые черты одной косой чертой, если она изменяет длину;

Он заменяет (последовательные) вхождения / и \ с тем, что находится в 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"