Удалить все символы после последнего экземпляра определенного символа

Как я могу удалить все содержимое строки после последнего появления символа косой черты / ?

Например, строка выглядит так:

http://localhost/new-123-rugby/competition.php?croncode=12345678

Я хочу удалить весь контент после последнего / так что это просто показывает:

http://localhost/new-123-rugby/

Но содержание после / может быть переменной длины.

Обратите внимание, что в URL может быть любое количество слешей. Он должен быть в состоянии удалить контент после последней косой черты. Там может быть больше, чем показано в примере выше.

-2

Решение

ты можешь попробовать это

$url = "http://localhost/new-123-rugby/competition.php?croncode=12345678";
preg_match("/[^\/]+$/", $url, $matches);
$newUrl = str_replace($matches[0],'',$url);
echo $newUrl;
2

Другие решения

Решение № 1, используя 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() первый.

Решение № 2, используя 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(),

Решение № 3, используя preg_replace():

$string = 'http://localhost/new-123-rugby/competition.php?croncode=12345678';
echo(preg_replace('#/[^/]*$#', '/', $string));

Недостатки: никто. Это хорошо работает, когда оба, когда $string содержит '/' и не содержит '/' (это не меняет $string в этом случае).

1

NOTA:

Вопрос был отредактирован таким образом, чтобы исходный ответ (под правкой) не соответствовал требованиям ОП. Он не был помечен как правка из 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

-3
По вопросам рекламы [email protected]