• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

xplode_me

Função para resumo / sumário

8 mensagens neste tópico

Viva de novo!

Não encontrei nada no fórum, pelo menos na secção PHP que me ajudasse neste campo, e por isso peço, de novo, a vossa ajuda  :P

Tenho uma função summarize

function summarize($paragraph){
$limit = 50;
$tok = strtok($paragraph, " ");
while($tok)
	{
		$text .= " $tok";
		$words++;
		if(($words >= $limit) && ((substr($tok, -1) == "!")||(substr($tok, -1) == ".")))
		break;
		$tok = strtok(" ");
	}
$text .= ' '.$link;
return ltrim($text);
}

Que me pega no conteúdo do $paragraph e compila uma versão abreviada. O problema é que esta funcão não está a respeitar as tags HTML. Por exemplo, imaginemos que o $paragraph contém isto:

$paragraph = "<div> <img src="teste"/> <p> Olá!! </p></div>"

Volta e meia a função corta a string onde não devia, e por exemplo corta algum </div> ou </p> ou outra qqer tag html.

Existe alguma maneira de prevenir este problema?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

acho que a melhor maneira que tens é ir controlando todas as tags que são iniciadas (através de um array) e verificar se o corte não está a ser feito numa tag mas sim no texto em si, fechando depois todas as tags que tiveres abertas...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou visto que é um sumário pequeno (a julgar pelo limite de 50 caracteres), acho que nem te precisavas de preocupar com a formatação. Mas não sei, pode ser que tenhas mesmo de aplicar, mas em pequenos resumos, acho mais importante o texto do que a formatação em si.

Se optares por esta via, é encontrares as tags de html, removê-las, e apresentar só o conteúdo até 50 caracteres sem ser formatado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema é que às vezes vêm imagens, e não quero fazer strip às imagens, mas tb n quero q elas acabem cortadas na função!....

O array é capaz de ser uma boa ideia, tenho de a desenvolver.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto é mt à frente para os meus conhecimentos de expressões regulares ;)

Alguém pode engendrar uma função?

Penso que tenho o funcionamento mais ou menos pensado: basta procurar um <div>, <p>, <img>, etc e por cada um que achar deve depois encontrar a tag q o fecha,  se nao encontrar entao acrescentar à string.

Por exemplo:

uma string $conteudo

<div id="cell">
<p>Ola, aqui fica uma <strong>imagem</strong> de teste: <img src="url"/></p>
</div>

Na função nao deveria ser cortada a meio por ex.

Aliás, aqui até fica um caso especial, que é o self-closing <img>.

Ficaria eternamente agradecido a quem conseguisse tal prodigiosa função :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E qual é o resultado que pretendes obetr para essa string de exemplo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

function close_html_tags($html){
  #put all opened tags into an array
  preg_match_all("#<([a-z]+)( .*)?(?!/)>#iU",$html,$result);
  $openedtags=$result[1];

  #put all closed tags into an array
  preg_match_all("#</([a-z]+)>#iU",$html,$result);
  $closedtags=$result[1];
  $len_opened = count($openedtags);
  # all tags are closed
  if(count($closedtags) == $len_opened){
    return $html;
  }

  $openedtags = array_reverse($openedtags);
  # close tags
  for($i=0;$i < $len_opened;$i++) {
    if (!in_array($openedtags[$i],$closedtags)){
      $html .= '</'.$openedtags[$i].'>';
    } else {
      unset($closedtags[array_search($openedtags[$i],$closedtags)]);
    }
  }
  return $html;
}

Encontrei esta pelos mendros dessa internet fora! Confesso que nem olhei para o código, mas faz o que eu quero.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Essa função

echo close_html_tags('<div id="cell">
<p>Ola, aqui fica uma <strong>imagem</strong> de teste: <img src="url"/></p>
</div>');

devolve isto

<div id="cell">
<p>Ola, aqui fica uma <strong>imagem</strong> de teste: <img src="url"/></p>
</div></img>

Acho estranho que queiras isto, mas OK ;) ainda bem que encontraste o que queres.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora