PHP: Cortando strings (substr)

Palavras-chave: PHP, strings, substr, strpos

Um dos tipos de dados com mais recursos na linguagem PHP é sem dúvida as strings. A linguagem PHP possui inúmeras funções para manipulação de strings e uma das mais utilizadas é o substr.

O substr é responsável por retornar um pedaço da string. Para isto ele se utiliza de três parâmetros: a própria string, o índice inicial e a quantidade de caracteres a ser retornada.

Acontece que podemos utilizar também um índice negativo, desta forma o PHP analisa a string contando N caracteres a partir do final, e não a partir do início. Veja a seguir alguns exemplos:

<?php
$texto = "eu não sou besta pra tirar onda de herói";

echo substr($texto, 0, 16);  // eu não sou besta
echo "<br>\\n";
echo substr($texto, 11);     // besta pra tirar onda de herói
echo "<br>\\n";
echo substr($texto, 11, 9);  // besta pra
echo "<br>\\n";
echo substr($texto, -5);     // herói
echo "<br>\\n";
?>

Também podemos utilizar a substr() em combinação com a strpos(). A strpos detecta a posição que uma string ocorre dentro de uma expressão.

No exemplo seguinte, detectamos onde ocorre a palavra “http://” para retornar somente o domínio presente no texto:

<?php
$texto = "retornarei somente o domínio de http://www.pablo.blog.br";
$posicao = strpos($texto, 'http://');
echo substr($texto, $posicao+11); // pablo.blog.br
echo "\\n<br>";
?>
This entry was posted in PHP. Bookmark the permalink.

27 Responses to PHP: Cortando strings (substr)

  1. orgutus says:

    No caso de strings (acentuadas) em UTF-8, é melhor usar o mb_substr.

    Usando só o substr, a string resultante aprensenta erros de codificação. No mais, é a mesma sintaxe.

  2. Valeu, obrigado pela diga…

  3. Heigler says:

    Simples e objetivo.
    Parabéns.

    Apenas uma dúvida: Há como obter a posição final através do strpos? Seguindo o exemplo temos
    $texto = “retornarei somente o domínio de http://www.pablo.blog.br“;
    mas e caso eu quisesse resgatar a string de um formulário por exemplo onde eu jamais saberia a posição final exata para usar o substr.
    Exemplificando:
    $texto = “retornarei somente o domínio de http://www.pablo.blog.br mais conteúdo etc etc”;
    Quero usar parâmetros que retornem a string partindo de http até .br mas não sei a localização exata do final.

    Abraços,

    • David says:

      Nesse caso, é melhor você usar a função que pega a URL.

      $url = $_SERVER[‘REQUEST_URI’];

      echo $url;

  4. Djeison says:

    Muito bom, me ajudou muito essa dica;

    Abraço.

  5. muito boa a sua dica.. parabens

  6. Marcio says:

    Muito bom post, resolvi meu problema.

  7. Henrique Golinelli says:

    Outra excelente dica é usar o explode onde vc pode separar os campos por um delimitador
    linha=’3ALFA,3 – ALFA ANDROSTANEDIOL GLUCORONIDE,Androstenediol, 3 alfa diol,543,,28.05.006.1,2/9/2011 9:07,N’
    $array=explode(“,”,$linha);
    echo “Codigo $array[0] ,Nome $array[1], Sinonimo $array[2], Material $array[3] ,DadoObrigatorio $array[4],CodigoAMB$array[5],exaDtUltAlt$array[6],EhCurva$array[7] “;

  8. Alessandro says:

    Obrigado pela dica

  9. Sergio Porssionatto says:

    Meu senário é o seguinte, tenho uma tabela de logradouros, com os seguintes dados:

    rua , leopoldo
    avenida , trindade
    praça , barnabé

    a pergunta é: Como no PHP eu pego somente o que esta depois da VIRGULA ?????

    Não consigo achar resposta em lugar nenhum, me ajudem .

    Abraços !!!!

    • Thiago says:

      Na boa, a resposta está no tópico acima do seu. leia-o com atenção, que você terá a resposta que pediu.

    • Hugo Mendes says:

      Função:


      Espero ajuda, até a próxima!

    • Hugo Mendes says:

      Função:
      <?php
      function virgula($texto){
      $texto = substr($texto, (strpos($texto, ',')) + 1);
      echo $texto;
      }
      virgula("Rua , Leopoldo"); // Leopoldo
      virgula("Avenida , Trindade"); // Trindade
      virgula("Praça , Barnabé"); // Barnabé

      Espero ajuda, até a próxima!

  10. Roberto Vieira says:

    Galera,
    Tenho o seguinte cenário:

    Tenho um arquivo .txt que está com vários emails, mas tudo bagunçado:
    Ex: ; diecles ;

    Estou precisando ler este arquivo e listar apenas os emails:
    Ex: dfarcoverde@gmail.com;
    diecles@supermercados-arcoiris.com.br;

    Tenho os “” para poder pegar os e-mails, mas ainda não achei uma solução.
    Grato pela ajuda de todos e ótimo post.

  11. Roberto Vieira says:

    *Tenho os “colchetes” para…

  12. Temóteo says:

    Muito bom!
    Estou fascinado com PHP.

  13. Jose Antonio says:

    Tenho este cenário um texto corrido:

    Processo 1051964-21.2xx4.8.26.0100 – Alimentos – Lei Especial No 5.478/68 – Oferta – C.F.C.C. – J.V.P.C. e outros – Vistos. Fls. 259/263: a par do pedido extrapolar os limites desta lide alimentar, manifestem-se os réus, no prazo de 48 horas. Após, com ou sem manifestação, ao Ministério Público. Int. – ADV: KATIA (OAB 111/SP), RODRIGO GASP (OAB 111/SP)
    Processo 24432-38.12338.26.0100 – Inventário – Inventário e Partilha – LÍaS MARLY DE e outros – *Folhas 64/69-Ciência da pesquisa do Bacenjud* – ADV: JOEL CUNHA (OAB 12313/SP)
    Processo 111220-45.111.8.26.0100 – Procedimento Ordinário – Investigação de Paternidade – A.A.R. – Folhas 41/44- Ciência da pesquisa do Bacenjud* – ADV: DEFENSORIA PÚBLICA DO ESTADO DE SÃO PAULO (OAB 999999/DP)

    Precisaria sparar cada um dos registros que começa com Processo Até o fim dele. Termina com “)” mas pode existir outras “)” no meio do texto (então penso que seria o espaco o delimitador ou o outro Processo). Assim preciso separar cada ocorrência e jogar em uma variável para depois inserir em um banco de dados…(tabela processos Processo, texto, advogados)

    Como seleciono o texto neste cenário? Entre dois caracteres?
    Grato pela ajuda..

    • José Antônio, poderia me enviar um arquivo contendo esse conteúdo para analisar e poder te dar uma força, pois, em casos como o seu, primeiramente precisamos analisar se existem padrões na montagem dos dados para depois partimos para uma programação efetiva. No aguardo, abs.

  14. Wellerson says:

    to com uma atividade de php pedindo pra efetuar um algorítmo php que receba uma string e um caracter de busca e descubra o numero de ocorrencias deste caracter dentro da string. Para isso utilize laço de repetição , e as funções de string “strlen” e “substr”

  15. paulo robson says:

    Bom post, valeu mesmo codare.net

  16. Good site you have here.. It’s hard to find quality writing like
    yours nowadays. I truly appreciate individuals like you!
    Take care!!

  17. If you think patterned wall paper in nursery rhymes patterns
    will be a safer choice, you will be in for a increased shock due to the fact toddlers adore
    to rip off wall papers or leave a stamp of their artistic attempts on that wall
    paper. There will be plenty of surprising and exciting features during
    the game. During the summer months this can become especially challenging because of the length of time kids are out of school.

  18. Elias says:

    Eu tenho o seguinte código:

    $nome = ‘Joana de Angelis’;
    // quero pegar apenas o ‘DE’
    echo substr($nome,strpos($nome,’ ‘),strrpos($nome,’ ‘)-4);

    dessa forma funciona, no entanto gostaria de saber qual a outra forma fazer

    alguém sabe?

  19. However you can make money lumsum from binary possibility buying and selling but there it is advisable to set a plant and strategically march ahead to hit the bull.

  20. Charlles says:

    N2400001012015ADIANT CONTA NR$ 00000000010000016541513 VIVO S.A. N24001N V0042628834
    N2400001022015ADIANT CONTA NR$ 0000000005000001234567 LOJAS RENNE N24001N V0042608838
    N2400001042015ADIANT CONTA NR$ 000000000004000123456 LOJAS RENNE N24001N V0042608837

    Preciso pegar os dados sequenciais depois de N24000. Consigo pegar o primeiro registro,
    mas esse registro pode se repetir várias vezes como acima.
    Estou usando a seguinte programação para pegar a data que vem depois do registro N24000
    assim:
    $posicao = strpos($contents, ‘N24000’);
    $pedfin_data = substr($contents, $posicao+6, 8);
    Resultado seria = 01012015

    Mas dessa forma só consigo pegar o primeiro registro.
    Como poderia fazer para pegar os demais?
    Alguém poderia ajudar?

Leave a Reply

Your email address will not be published. Required fields are marked *