$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"