Как я могу удалить все содержимое строки после последнего появления символа косой черты /
?
Например, строка выглядит так:
http://localhost/new-123-rugby/competition.php?croncode=12345678
Я хочу удалить весь контент после последнего /
так что это просто показывает:
http://localhost/new-123-rugby/
Но содержание после /
может быть переменной длины.
Обратите внимание, что в URL может быть любое количество слешей. Он должен быть в состоянии удалить контент после последней косой черты. Там может быть больше, чем показано в примере выше.
ты можешь попробовать это
$url = "http://localhost/new-123-rugby/competition.php?croncode=12345678";
preg_match("/[^\/]+$/", $url, $matches);
$newUrl = str_replace($matches[0],'',$url);
echo $newUrl;
substr()
+ strrpos()
:$string = 'http://localhost/new-123-rugby/competition.php?croncode=12345678';
$pos = strrpos($string, '/');
if ($pos !== FALSE) {
echo(substr($string, 0, $pos + 1));
}
функция strrpos()
находит положение прошлой появление /
в строке, substr()
извлекает необходимую подстроку.
недостаток: если $string
не содержит '/'
, strrpos()
возвращается FALSE
а также substr()
не возвращает то, что мы хотим. Необходимо проверить значение, возвращаемое strrpos()
первый.
explode()
+ implode()
:$string = 'http://localhost/new-123-rugby/competition.php?croncode=12345678';
$array = explode('/', $string);
if (count($array) > 1) {
array_pop($array); // ignore the returned value, we don't need it
echo(implode('/', $array).'/'); // join the pieces back, add the last '/'
}
В качестве альтернативы вместо array_pop($array)
мы можем сделать последний компонент пустым, и нет необходимости добавлять дополнительные '/'
в конце:
$string = 'http://localhost/new-123-rugby/competition.php?croncode=12345678';
$array = explode('/', $string);
if (count($array) > 1) {
$array[count($array) - 1] = ''; // empty the last component
echo(implode('/', $array)); // join the pieces back
}
недостаток (для обеих версий): если $string
не содержит '/'
, explode()
создает массив, содержащий одно значение, а остальная часть кода производит либо '/'
(первый кусок кода) или пустая строка (вторая). Необходимо проверить количество элементов в массиве, произведенном explode()
,
preg_replace()
:$string = 'http://localhost/new-123-rugby/competition.php?croncode=12345678';
echo(preg_replace('#/[^/]*$#', '/', $string));
Недостатки: никто. Это хорошо работает, когда оба, когда $string
содержит '/'
и не содержит '/'
(это не меняет $string
в этом случае).
Вопрос был отредактирован таким образом, чтобы исходный ответ (под правкой) не соответствовал требованиям ОП. Он не был помечен как правка из OP.
РЕДАКТИРОВАТЬ:
Обновил мой ответ, чтобы он теперь соответствовал требованиям ОП:
(Теперь он работает с таким количеством слешей, как вы хотите)
Также будет работать с использованием
http://localhost/new-123-rugby////////competition.php?croncode=12345678
<?php
$url = "http://localhost/new-123-rugby/competition.php?croncode=12345678";
echo dirname($url) . "/";
?>
Выход:
http://localhost/new-123-rugby/
Это должно работать для вас:
<?php
$string = "http://localhost/new-123-rugby/competition.php?croncode=12345678";
echo $string = substr($string, 0, strpos(strrev($string), "/")-2);
?>
Выход:
http://localhost/new-123-rugby/
Демо-версия: http://ideone.com/0R9QUG