Jump to content


Photo

Str_truncate()


  • Faça o login para participar
25 replies to this topic

#1 Chinello Cybernético

Chinello Cybernético

    Simplesmente "Chinello"

  • Usuários
  • 1892 posts
  • Sexo:Masculino
  • Localidade:Canoas - RS

Posted 16/02/2006, 14:23

Sintaxe: str_truncate( string str, int length [, int where_reply] )
Retorno: string
Descrição: Retorna uma string cortando ela no primeiro espaço (caractere espaço) próximo de $length. O parâmetro 'where_reply' define se o espaço será antes ou depois de $lenght.
Bibliotecas: Nenhuma
Limitações: PHP 3.0+

Função:
define("TRUNC_BEFORE_LENGHT", 0);
define("TRUNC_AFTER_LENGHT", 1);

function str_truncate($str, $length, $rep=TRUNC_BEFORE_LENGHT)
{
	//adicionada em 27/06/2006 para corrigir um bug
	if(strlen($str)<=$length) return $str;

	if($rep == TRUNC_BEFORE_LENGHT) $oc = strrpos(substr($str,0,$length),' ');
	if($rep == TRUNC_AFTER_LENGHT)	$oc = strpos(substr($str,$length),' ') + $length;

	return substr($str, 0, $oc);
}
Exemplo de utilização:

Lembra aquele texto que você quer cortar pra colocar num espacinho pequeno dentro do site? Aí vc usa substr() e acaba cortanto no meio de uma palavra. Imagine a situação o seguinte texto:

Então, chapeuzinho vermelho decide tomar no cantinho bem escondida, uma lata de leite condensado.

Então, chapeuzinho vermelho decide tomar no c...

:huh: :o :unsure: :assobio:

Fica chato neh? hehehe

Usando a str_truncate(), vc faria:
<?
$frase = "Então, chapeuzinho vermelho decide tomar no cantinho bem escondida, uma lata de leite condensado.";

print str_truncate($frase, 45, TRUNC_AFTER_LENGHT) . '...'; 
?>
E seria exibido:

Então, chapeuzinho vermelho decide tomar no cantinho...

Que tal? :D


----------------- Editando -----------------
A função só vai funcionar se o uso dela for correto.. Ou seja, os dados tem que estar dentro do que a função espera..

Como tenho uso específico para esta função não me preocupei em validar os dados.. Por isso, caso alguém queira adicionar checagem de dados pra não dar merd* qto utilizar a função em situações que não estão sob controle, sintam-se a vontade..

Vlw.. (y)

Edição feita por: Chinello Cybernético, 27/06/2006, 03:45.

Diego Sampaio - kroW - PHP Framework > http://chinelloweb.net/
chinello at gmail dot com

System > Athlon 64 3200+ Mobile | Kubuntu 7.04 Fesity Fawn AMD64 | Kernel 2.6.20-16
Coding @ KDE 3.5.7 | PHP 5.2.1 | Apache 2.2.3 | MySQL 5.0.38

#2 kartesus

kartesus

    ich bin der Geist der stets verneint

  • Usuários
  • 210 posts
  • Sexo:Não informado
  • Localidade:Rio Grande do Sul
  • Interesses:PHP e sexo

Posted 16/02/2006, 14:48

Um bom exemplo explica muito! E essa frase foi escolhida a dedo! (y)
Só achei uma pena que dessa vez eu não tenho nada pra corrigir ou dizer que eu faria diferente!! :P Só falta mesmo verificar a consistência; tipo se $lenght não é maior que strlen($str)
Ainda com dúvidas? Poste-as aki

#3 Stormbringer

Stormbringer

    I'd love to stay with you all

  • Ex-Admins
  • 2927 posts
  • Sexo:Não informado
  • Localidade:Goiânia - GO
  • Interesses:Atualmente: pesquisa e desenvolvimento de web-games

Posted 06/03/2006, 08:39

bom, nao gostei do uso de CONSTANTES, ehhehe... mas de boa, dá pra adaptar :lol:


muito boa mesmo ;)

๑۩۞۩๑Let the Carnage Begin!!๑۩۞۩๑


#4 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 06/03/2006, 09:54

bom, nao gostei do uso de CONSTANTES, ehhehe... mas de boa, dá pra adaptar :lol:


muito boa mesmo ;)

Ahh que isso Stormbringer!
Fica com a aparência de funções nativas do PHP que possuem argumentos pré-definidos por constantes. :D
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#5 Guilherme Blanco

Guilherme Blanco

    Loading...

  • Conselheiros
  • 891 posts
  • Sexo:Masculino
  • Localidade:São Carlos - SP/Brasil
  • Interesses:Programação Web e minha namorada (Maria Camila).

Posted 15/03/2006, 15:52

Hm... interessante sua função Chinello!


Eu uso uma parecida, que encontrei na net a MUITO tempo atrás e até hoje nunca tive problemas com ela... a única diferença é a forma do truncate dela... pode ser inicial ou no meio, mas nunca final. Exemplos:

Eu coloquei meu cabo de enxada no seu c...
Eu coloquei meu cabo ... no seu curral.
(NÃO FAZ!) ...cabo de enxada no seu curral.


Taí a função:

  // Function that chops a string into a smaller string (Code by: Aidan Lister)
  function str_chop($string, $length = 60, $center = false, $append = null){
      // Set the default append string
      if ($append === null)
          $append = ($center === true) ? ' ... ' : '...';

      // Get some measurements
      $len_string = strlen($string);
      $len_append = strlen($append);

      // If the string is longer than the maximum length, we need to chop it
      if ($len_string > $length) {
          // Check if we want to chop it in half
          if ($center === true) {
              // Get the lengths of each segment
              $len_start = $length / 2;
              $len_end = $len_start - $len_append;

              // Get each segment
              $seg_start = substr($string, 0, $len_start);
              $seg_end = substr($string, $len_string - $len_end, $len_end);

              // Stick them together
              $string = $seg_start.$append.$seg_end;
          } else {
              // Otherwise, just chop the end off
              $string = substr($string, 0, $length - $len_append).$append;
          }
      }

      return $string;
  }


Forma de uso:

// Vai exibir: Eu coloquei meu cabo de enxada no seu c...
echo str_chop($str, 39);

// Vai exibir: Eu coloquei meu cabo ... no seu curral.
echo str_chop($str, 35, true);

// Vai exibir: Eu coloquei meu cabo =D no seu curral.
echo str_chop($str, 35, true, "=D");



[]s,
<script language="WebFórum">
// Dados:
Nome("Guilherme Blanco");
Localidade("São Carlos - SP/Brasil");
Cargo("Manutenção");
</script>

#6 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 23/03/2006, 13:00

Dei uma modificada na função para não precisar definir a constante externamente.

function str_truncate($str, $length, $mode = TRUNC_BEFORE_LENGHT)
{
    switch ($mode) {

        case TRUNC_BEFORE_LENGHT:
            $oc = strrpos(substr($str, 0, $length), ' ');
            break;
            
        case TRUNC_AFTER_LENGHT:
            $oc = strpos(substr($str,$length), ' ') + $length;
            break;
    }
    
    return substr($str, 0, $oc);
}

Obs.: Quem deixa habilitado para exibir NOTICES, será exibido alguns por causa das constantes indefinidas.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#7 Chinello Cybernético

Chinello Cybernético

    Simplesmente "Chinello"

  • Usuários
  • 1892 posts
  • Sexo:Masculino
  • Localidade:Canoas - RS

Posted 23/03/2006, 17:41

Dei uma modificada na função para não precisar definir a constante externamente.

function str_truncate($str, $length, $mode = TRUNC_BEFORE_LENGHT)
{
    switch ($mode) {

        case TRUNC_BEFORE_LENGHT:
            $oc = strrpos(substr($str, 0, $length), ' ');
            break;
            
        case TRUNC_AFTER_LENGHT:
            $oc = strpos(substr($str,$length), ' ') + $length;
            break;
    }
    
    return substr($str, 0, $oc);
}

Obs.: Quem deixa habilitado para exibir NOTICES, será exibido alguns por causa das constantes indefinidas.

Mas Eclesiastes...

A "minha" função tb dá pra usar sem declarar as constantes, mas é óbvio, q tb vai exibir notices..

A única diferença da tua em relação a minha, é q a tua exibe 2 notices a cada utilização da função, e a minha exibe 3, se as constantes não forem definidas. ;) (y)

Fui. :P
Diego Sampaio - kroW - PHP Framework > http://chinelloweb.net/
chinello at gmail dot com

System > Athlon 64 3200+ Mobile | Kubuntu 7.04 Fesity Fawn AMD64 | Kernel 2.6.20-16
Coding @ KDE 3.5.7 | PHP 5.2.1 | Apache 2.2.3 | MySQL 5.0.38

#8 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 23/03/2006, 18:09

É verdade, é que não parei para analisar seu código na parte da condicional.
Julguei-o logo pelo fato de você ter colocado a definição das constantes.

Mas logo que fiz usando switch/cases, vi que dá o problema pelo fato das constantes indefinidas. Problema esse que daria também no código original como me fora dito. ;)


Bom, obrigado pelo esclarecimento. (y)
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#9 MarcoviZ

MarcoviZ

    ubuntu for human being

  • Usuários
  • 1137 posts
  • Sexo:Não informado

Posted 15/07/2006, 17:30

mesmo assim, " tomar no cantinho... " é estranho =-)
[]'s

#10 zegames

zegames

    Novato no fórum

  • Usuários
  • 8 posts
  • Sexo:Não informado

Posted 16/08/2006, 04:13

Muito boa essa função, mas eu tenho uma pequena dúvida...

Eu tenho um query aqui que eu puxo somente os 100 primeiros caracteres de um texto, veja:

mysql_query("SELECT campo1, SUBSTRING(campo2,1,100) as campo2, campo3, ......

Funciona muito bem, mas eu fico com o problema do "tomar no c..." rsrs.

Existe alguma forma de solucionar isso usando essa função do mysql?

#11 Chinello Cybernético

Chinello Cybernético

    Simplesmente "Chinello"

  • Usuários
  • 1892 posts
  • Sexo:Masculino
  • Localidade:Canoas - RS

Posted 16/08/2006, 12:35

Muito boa essa função, mas eu tenho uma pequena dúvida...

Eu tenho um query aqui que eu puxo somente os 100 primeiros caracteres de um texto, veja:

mysql_query("SELECT campo1, SUBSTRING(campo2,1,100) as campo2, campo3, ......

Funciona muito bem, mas eu fico com o problema do "tomar no c..." rsrs.

Existe alguma forma de solucionar isso usando essa função do mysql?

Vc pode pegar 130 caracteres no MySQL, e utilizar a função str_truncate() pra limitar em 100. ;)
Diego Sampaio - kroW - PHP Framework > http://chinelloweb.net/
chinello at gmail dot com

System > Athlon 64 3200+ Mobile | Kubuntu 7.04 Fesity Fawn AMD64 | Kernel 2.6.20-16
Coding @ KDE 3.5.7 | PHP 5.2.1 | Apache 2.2.3 | MySQL 5.0.38

#12 zegames

zegames

    Novato no fórum

  • Usuários
  • 8 posts
  • Sexo:Não informado

Posted 16/08/2006, 19:06

ehehehhhe eu pensei exatamente isso logo após postar, mas fiquei na esperança de alguma outra idéia.

Vou fazer iso mesmo ;)

Valeu.

#13 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 16/08/2006, 23:19

Existe alguma forma de solucionar isso usando essa função do mysql?


Para resolver diretamente na query, você teria que fazer uma função, que certamente utilizaria a função SUBSTRING().

Edição feita por: Eclesiastes, 16/08/2006, 23:22.

Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#14 kurt_rp

kurt_rp

    12 Horas

  • Usuários
  • 140 posts
  • Sexo:Masculino
  • Localidade:Rio Grande do Sul
  • Interesses:Programação web e designer.

Posted 22/08/2006, 15:50

Eu consegui agora fazer funcionar o script do "Chinelo"...

O problema agora eh q eu to tendo outra dificuldade com relação a contagem d caracteres..
Eh q no meu sistema eu fiz uma barra d texto pra poder formatar o texto q nem esse aki do forum pra postar...
E dai qdo cadastra ele vai pro banco assim...
<p align="justify"><strong>Iniciando 2&ordm; semestre 2006</strong></p><p align="justify">Já est&atilde;o abertas as matrículas para o 2&ordm; semestre de 2006

Sendo q eu queria q ele contasse os caracteres so do texto e nao do cod. html tb..
Sera q teria alguma forma d contornar isso???
Ou terei msm de criar duas caixas d texto pra dai na hora d cadastrar colocar uma o resumo e outra o texto completo... pois eu queria fazer uma coisa mais praticar sem precisar roubar tempo sempre q for cadastrar um texto novo.

Se alguem souber alguma solução posta ai.

Flw galera!


Eu to puxando esse texto do banco...
Dai qdo eu listo dos textos q estao salvos na tabela.. ele mostra somente o primeiro.. e depois o resto nao funciona...
Pros demais da o seguinte erro...

Fatal error: Cannot redeclare str_truncate() (previously declared


Como eu faço agora pra esse script funcionar pra todos os textos cadastrados??

Edição feita por: kurt_rp, 22/08/2006, 17:06.

|| PLUG CIDADE || - O portal turistico do vale do Rio Pardo
http://www.plugcidade.com.br

|| PLUG BALADA || - O portal de festas do vale do Rio Pardo
http://www.plugbalada.com.br

#15 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 22/08/2006, 19:58

A definição da função deve aparecer apenas 1 vez.

O que pode ser feito várias vezes é a chamada da função.

http://br2.php.net/m...R/functions.php
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq