Estou tentando extrair uma substring. Preciso de ajuda para fazer isso em PHP.
Aqui estão alguns exemplos de strings com os quais estou trabalhando e os resultados necessários:
home/cat1/subcat2 => home
test/cat2 => test
startpage => startpage
Eu quero pegar a string até a primeira /
, mas se não /
houver, pegue a string inteira.
Eu tentei,
substr($mystring, 0, strpos($mystring, '/'))
Eu acho que diz - obtenha a posição de /
e, em seguida, obtenha a substring da posição 0 para essa posição.
Não sei como lidar com o caso em que não há /
, sem deixar a declaração muito grande.
Existe uma maneira de lidar com esse caso também sem tornar a instrução PHP muito complexa?
s($str)->beforeFirst('/')
útil, conforme encontrado nesta biblioteca autônoma .Respostas:
Usar
explode()
Neste caso, estou usando o
limit
parâmetro paraexplode
que o php não varra a string mais do que o necessário.fonte
$arr = explode('/',$mystring,2); echo $arr[0];
. Eu sou incapaz de obter a primeira seqüência de caracteres em uma declaração em si -echo explode('/',$mystring,2)[0];
. Como explodir retorna uma matriz, eu deveria conseguir fazer isso certo? Mas eu recebo um erro. Alguma sugestão?explode() + [0]
é uma maneira longa de escreverstrtok($string, "/")
A solução mais eficiente é a
strtok
função:Por exemplo:
e
fonte
current-explode
solução. (Não que eu usá-lo tantas vezes que importa.)explode
soluções fornecidas.strtok
éfirst/second
retornará,first
mas/second
retornará emsecond
vez de uma sequência vazia.fonte
Que tal isso:
Basta adicionar um '/' ao final do mystring para ter certeza de que há pelo menos um;)
fonte
Versão de uma linha da resposta aceita:
Deve funcionar no php 5.4+
fonte
Este é provavelmente o exemplo mais curto que me ocorreu:
1)
list()
atribuirá automaticamente a string até"/"
que o delimitador seja encontrado2) se o delimitador
"/"
não for encontrado, a string inteira será atribuída... e se você ficar realmente obcecado com desempenho, poderá adicionar um parâmetro extra para explodir, o
explode("/", $mystring, 2)
que limita o máximo dos elementos retornados.fonte
strtok()
é inseguro.strtok()
?strtok()
inseguro?Tarde e melhor que nunca. O php tem uma função predefinida para isso. aqui está esse bom caminho.
se você deseja obter a peça antes da partida, basta definir before_needle (terceiro parâmetro) como
true
http://php.net/manual/en/function.strstr.phpfonte
strstr
é um pouco mais rápido questrtok
. Eu irei com o primeiro.A função strstr () no PHP 5.3 deve fazer este trabalho. No entanto, o terceiro parâmetro deve ser definido como true.
Mas se você não estiver usando o 5.3, a função abaixo deve funcionar com precisão:
Eu ainda não testei, mas isso deve funcionar muito bem .. E é bem rápido também
fonte
strstr()
, mas lembre-se de que ele retornaráfalse
se a sequência não contiver$needle
, portanto, asexplode()
soluções acima são mais adequadas nesse caso.Você pode criar uma função auxiliar para cuidar disso:
Aqui está um caso de uso:
fonte
Você pode tentar usar uma regex como esta:
às vezes, porém, a regex é mais lenta; portanto, se o desempenho é um problema, faça o benchmark corretamente e use outra alternativa com substrings, se for mais adequado para você.
fonte
explode
, seria interessante ver o que é mais rápido.Usar
current
emexplode
facilitaria o processo.fonte
fonte
Você também pode usar esta solução de uma linha
fonte
Eu acho que isso deve funcionar?
fonte
por que não usar:
OU:
fonte