Obter caracteres após o último / no url

Respostas:

265

Muito simplesmente:

$id = substr($url, strrpos($url, '/') + 1);

strrpos obtém a posição da última ocorrência da barra; substr retorna tudo após essa posição.


Conforme mencionado por redanimalwar, se não houver nenhuma barra, isso não funciona corretamente, pois strrposretorna false. Aqui está uma versão mais robusta:

$pos = strrpos($url, '/');
$id = $pos === false ? $url : substr($url, $pos + 1);
DisgruntledGoat
fonte
Isso corta o primeiro caractere se não houver nenhuma barra.
redanimalwar
@redanimalwar Eu adicionei outra solução
DisgruntledGoat
9
Estou me perguntando por que $str = basename($url)não está recebendo mais votos positivos, funciona perfeitamente bem para mim.
redanimalwar
2
@redanimalwar (1) basename é destinado a caminhos de arquivo, não URLs - acho que sempre retornará o mesmo resultado, mas pode haver casos extremos como barras invertidas; (2) o nome de base funciona apenas para barras, enquanto minha resposta pode ser facilmente modificada se outra pessoa quiser fazer a mesma coisa com um caractere diferente.
DisgruntledGoat
Obrigado. Simples e prático !!
Rodrigo Zuluaga
51
$str = basename($url);
GZipp
fonte
1
Isso funciona em urls? O nome de base não se destina a caminhos de arquivo?
random_user_name
2
Parece funcionar bem, é uma função de string; não verifica se o caminho existe.
Gifford N.
14

Você pode explodir com base em "/" e retornar a última entrada:

print end( explode( "/", "http://www.vimeo.com/1234567" ) );

Isso se baseia em explodir a corda, algo que não é necessário se você sabe que o padrão da própria corda não mudará tão cedo. Você pode, alternativamente, usar uma expressão regular para localizar esse valor no final da string:

$url = "http://www.vimeo.com/1234567";

if ( preg_match( "/\d+$/", $url, $matches ) ) {
    print $matches[0];
}
Sampson
fonte
explodesempre parece mais sobrecarga para mim, embora eu nunca tenha cronometrado para ver quão rápido é.
DisgruntledGoat
Parece que explodir () é um pouco mais lento. Em 10k instâncias, este é o tempo gasto para ambos. substr () primeiro: 0,013657 / 0,045038
Sampson
Pode ser mais lento, mas prefiro explodir aqui. Especificamente se o url não contém nenhum "/", o +1 na resposta strrpos faz uma confusão explodir e ser capaz de superar.
Noam
1
O exemplo lança um aviso e deve ser definitivamente retrabalhado.
Xatenev
Sim, os dados explodidos devem ser uma variável
ymakux
11

Você pode usar substre strrchr:

$url = 'http://www.vimeo.com/1234567';
$str = substr(strrchr($url, '/'), 1);
echo $str;      // Output: 1234567
Gabriel
fonte
Mais como este: ltrim (strrchr ($ url, "/"), "/"); strchr retorna uma string, não um número
Denis Chenu
8
$str = "http://www.vimeo.com/1234567";
$s = explode("/",$str);
print end($s);
ghostdog74
fonte
3
minha versão, embora o resultado final seja o mesmo que o postado, permite que OP use os outros itens da string dividida, se desejar.
ghostdog74
esta é a resposta correta, já que o título pergunta depois de 'último' / na url
Tubarão Fabiano
1

array_pop(explode("/", "http://vimeo.com/1234567")); irá devolver o último elemento do url de exemplo

nikc.org
fonte
em php7 Devoluções: PHP Notice: Only variables should be passed by reference.
billynoah
0

Dois one liners - suspeito que o primeiro seja mais rápido, mas o segundo é mais bonito e diferente end()e array_pop(), você pode passar o resultado de uma função diretamente para current()sem gerar qualquer aviso ou aviso, uma vez que não move o ponteiro ou altera o array.

$var = 'http://www.vimeo.com/1234567';

// VERSION 1 - one liner simmilar to DisgruntledGoat's answer above
echo substr($a,(strrpos($var,'/') !== false ? strrpos($var,'/') + 1 : 0));

// VERSION 2 - explode, reverse the array, get the first index.
echo current(array_reverse(explode('/',$var)));
Billynoah
fonte
@redburn, usar end()desta forma no php 5.4+ e superior irá gerar um aviso. De acordo com a documentação: " você deve passar uma variável real e não uma função que retorna um array porque apenas variáveis ​​reais podem ser passadas por referência. ".
billynoah
-1

Aqui está uma bela função dinâmica que escrevi para remover a última parte do url ou do caminho.

/**
 * remove the last directories
 *
 * @param $path the path
 * @param $level number of directories to remove
 *
 * @return string
 */
private function removeLastDir($path, $level)
{
    if(is_int($level) && $level > 0){
        $path = preg_replace('#\/[^/]*$#', '', $path);
        return $this->removeLastDir($path, (int) $level - 1);
    }
    return $path;
}
Mahmoud Zalt
fonte