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:
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.
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:
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.
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)));
@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
*/privatefunction removeLastDir($path, $level){if(is_int($level)&& $level >0){
$path = preg_replace('#\/[^/]*$#','', $path);return $this->removeLastDir($path,(int) $level -1);}return $path;}
s($str)->afterLast('/')
útil, conforme encontrado nesta biblioteca independente .Respostas:
Muito simplesmente:
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
strrpos
retorna false. Aqui está uma versão mais robusta:fonte
$str = basename($url)
não está recebendo mais votos positivos, funciona perfeitamente bem para mim.fonte
Você pode explodir com base em "/" e retornar a última entrada:
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:
fonte
explode
sempre parece mais sobrecarga para mim, embora eu nunca tenha cronometrado para ver quão rápido é.Você pode usar
substr
estrrchr
:fonte
fonte
array_pop(explode("/", "http://vimeo.com/1234567"));
irá devolver o último elemento do url de exemplofonte
PHP Notice: Only variables should be passed by reference
.Dois one liners - suspeito que o primeiro seja mais rápido, mas o segundo é mais bonito e diferente
end()
earray_pop()
, você pode passar o resultado de uma função diretamente paracurrent()
sem gerar qualquer aviso ou aviso, uma vez que não move o ponteiro ou altera o array.fonte
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. ".Aqui está uma bela função dinâmica que escrevi para remover a última parte do url ou do caminho.
fonte