Fazendo substr em texto com HTML

PHP
Enviado por Pedro Faria em Qua, 12/07/2006 - 16:03.PHP

A muitos dias atras o Marcello e eu estavamos tentando fazer uma função que retornasse X caracteres de uma string sendo que esta string continha tags de HTML... O grande problema seria não quebrar a string na metade de uma tag e/ou deixar tags abertas.

Após alguns dias eu fiz a minha versão... nem sei se foi util pra ele mas segue ae pra todos... quem tiver alguma crítica, comenta ae!

  1. <?php
  2.  
  3. function substrHTML($txt, $total) {
  4.   $stack = array();
  5.   $offset = $count = 0;
  6.  
  7.   while ($count < $total) {
  8.     preg_match('/([^&<]*)(.)?/', $txt, $rs, NULL, $offset);
  9.     $len = strlen($rs[1]);
  10.  
  11.     if (($count + $len) > $total) {
  12.       $len = $total - $count;
  13.       $rs[2] = '';
  14.     }
  15.  
  16.     $count += $len;
  17.     $offset += $len;
  18.  
  19.     switch ($rs[2]) {
  20.       case '&':
  21.         $offset = strpos($txt, ';', $offset) + 1;
  22.         $count++;
  23.         break;
  24.  
  25.       case '<':
  26.         if ($txt[$offset+1] == '/') {
  27.           array_pop($stack);
  28.         } else {
  29.           preg_match('/<(.*?)[ >]/', $txt, $t, NULL, $offset);
  30.           $tag = $t[1];
  31.           array_push($stack, $tag);
  32.         }
  33.         $offset = strpos($txt, '>', $offset) + 1;
  34.         break;
  35.     }
  36.   }
  37.  
  38.   $result = substr($txt, 0, $offset);
  39.   if (count($stack)) $result .= "</".join($stack, '></').">";
  40.  
  41.   return $result;
  42. }
  43.  
  44. // vai imprimir
  45. // "Hoje <b>est&aacute;</b> muito complicada<b> a situa&ccedil;</b>"
  46.  
  47. $txt = 'Hoje <b>est&aacute;</b> muito complicada<b> a situa&ccedil;&atilde;o do povo para <font color="red"> trabalhar</font></b>';
  48.  
  49. print '"'.substrHTML($txt, 35).'"';
  50.  
  51. ?>

Espero que seja util pra todos...

T+



Enviado por guest (não verificado(a)) em Qua, 12/07/2006 - 16:26.

Fala ae Pedrão foi muito util para mim e com certeza para os outros tambem vai ser..

valeu mesmo kra...
abraço e fica com DEUS.

Enviado por Assunção Jr. (não verificado(a)) em Dom, 16/07/2006 - 21:35.

Muito boa a função... Mas...
Ao testar de diversas formas encontrei um 'bug' no fechamento da tag.
Ex.:
$txt = '<p>Hoje <b>est&aacute;</b> muito complicada<b> a situa&ccedil;&atilde;o do povo para <font color="red"> trabalhar</font></b></p>';

print '"'.substrHTML($txt, 9).'"';

O resultado do código acima será: '<p>Hoje <b>est&aacute;</p></b>'...

Enviado por Pedro Faria em Seg, 17/07/2006 - 09:06.

as tags ficaram trocadas... vou ver e posto a correção ja ja!

Valeu cara!

Enviado por Victor (não verificado(a)) em Qua, 26/03/2008 - 18:32.

/*
Não seria melhor como está abaixo?
*/
$txt = 'Hoje <b>est&aacute;</b> muito complicada<b> a situa&ccedil;&atilde;o do povo para <font color="red"> trabalhar</font></b>';
echo substr(strip_tags($txt), 0, 4);

Enviado por Pedro Faria em Qui, 27/03/2008 - 10:10.

Não mesmo...

Parece que não entendeu a finalidade da função!

Enviado por Lucas (não verificado(a)) em Seg, 24/08/2009 - 00:16.

Nossa, cara... você criou uma função realmente boa! Não sei se era esse o caso do seu amigo, provavelmente era, como é o meu agora, mas essa função derruba o problema em fazer uma previa de notícia com uma notícia formatada em html!

Muito bom mesmo, parabéns e boa sorte com outras funções explendidas como essa!

Enviado por Luciane (não verificado(a)) em Ter, 15/09/2009 - 14:15.

Ta, utilizando o substr eu posso definir qual a posição começar. COmo que fica a função se no caso eu qeuria começar da 10º posição e terminar na 20º?

Se eu apenas mudar na função o número, o problema volta e as tags continuam aparecendo..
Exemplo:
$offset = 20;
$result = substr($txt, 10, $offset);

Aguardo ajuda.