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

Sign in to follow this  
xplode_me

Função para resumo / sumário

Recommended Posts

xplode_me

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?

Share this post


Link to post
Share on other sites
marinheiro

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...


há 10 tipos de pessoas: as que sabem binário e as que não sabem...[br][br]todas as nossas vidas não passam de release candidates... com o aperfeiçoamento, um dia chegaremos à versão final..

Share this post


Link to post
Share on other sites
softklin

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.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
xplode_me

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.

Share this post


Link to post
Share on other sites
xplode_me

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 :)

Share this post


Link to post
Share on other sites
pmg

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


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
xplode_me

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.

Share this post


Link to post
Share on other sites
pmg

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.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.