Tem como melhorar esse algoritmo?

10 respostas
R
Pessoal, gostaria de poder melhorar esse algoritmo ou ainda se existir alguma classe que ja o faça, qual seria??? meu programa envia msg html onde o usuario digita uma url e o programa envia o conteuodo do mesmo para o destinatario... o que acontece...a classe URL e URLConnection retorna a url do site porem as imagens e links sao referencias por local.. exemplo. num determinado, se vc exibir o codigo fonte vai ter trechos assim
<img src="/img/tltl.gif"
a classe url retorna isso tb e se eu enviar desse jeito, no email nao vai a imagem... ai eu tenho que ler toda a string url e onde tiver
public String getUrl() throws IOException {
		String linha, text;
		String comp = "src=\""+getLink();
		URL link = new URL(this.url);
		BufferedReader buffer = new BufferedReader(new InputStreamReader(link
				.openStream()));
		linha = "";
		text = "";
		while ((linha = buffer.readLine()) != null)
			text = text + linha +"\n";
		buffer.close(); // fecha o buffer
		String oi[] = text.split("src=\"");
		String sei = oi[0];
		int size = oi.length;
		for(int i=1; i<size; i++){
			sei = sei + (comp + oi[i]);
		}
		String comp2 = "href=\""+getLink();
		String nao[] = sei.split("href=\"");
		String ola = nao[0];
		int sizes = nao.length;
		for(int i=1; i<sizes; i++){
			ola = ola + (comp2 + nao[i]);
		}
		String comp3 = "background=\""+getLink();
		String back[] = ola.split("background=\"");
		String init = back[0];
		int tamanho = back.length;
		for(int i=1; i<tamanho; i++){
			init = init + comp3 + back[i];
		}
		String comp4 = "href=
so que ainda assim tem sites que vem defeituosos..
pq?
primeiro pq tem sites que usam aspas duplas  <img src="/img/tltl.gif" outros aidna usam aspas simples <img src='/img/tltl.gif'
outros tem partes que ja estao completos <img src="http://www.uol.com.br/img/tltl.gif" e nesses casos o programa também extrai e recoloca, perdendo tempo.

Entao minha pergunta é.. tem como ler os caracteres e numa cajadada , ja verificar se o link está absoluto, caso nao, ele ja substituir o href, o src ou backgroud... pq pela minha implementação, como podem ter visto, eu varro a string toda 1x para cada analise(ou seja, 1 vez para src, outra vez para href e outra para background) e isso pq ai tou considerando apenas apsas duplas... se for colocar aspas simples, dobrara o tempo de verificação.

ficou grandinho mas espero que esteja bem claro :)
qualquer duvida, podem falar :D"+getLink();
		String back1[] = init.split("href=
so que ainda assim tem sites que vem defeituosos..
pq?
primeiro pq tem sites que usam aspas duplas  <img src="/img/tltl.gif" outros aidna usam aspas simples <img src='/img/tltl.gif'
outros tem partes que ja estao completos <img src="http://www.uol.com.br/img/tltl.gif" e nesses casos o programa também extrai e recoloca, perdendo tempo.

Entao minha pergunta é.. tem como ler os caracteres e numa cajadada , ja verificar se o link está absoluto, caso nao, ele ja substituir o href, o src ou backgroud... pq pela minha implementação, como podem ter visto, eu varro a string toda 1x para cada analise(ou seja, 1 vez para src, outra vez para href e outra para background) e isso pq ai tou considerando apenas apsas duplas... se for colocar aspas simples, dobrara o tempo de verificação.

ficou grandinho mas espero que esteja bem claro :)
qualquer duvida, podem falar :D");
		String init1 = back1[0];
		int tamanho1 = back1.length;
		for(int i=1; i<tamanho1; i++){
			init1 = init1 + comp4 + back1[i];
		}
		String comp5 = "src=
so que ainda assim tem sites que vem defeituosos..
pq?
primeiro pq tem sites que usam aspas duplas  <img src="/img/tltl.gif" outros aidna usam aspas simples <img src='/img/tltl.gif'
outros tem partes que ja estao completos <img src="http://www.uol.com.br/img/tltl.gif" e nesses casos o programa também extrai e recoloca, perdendo tempo.

Entao minha pergunta é.. tem como ler os caracteres e numa cajadada , ja verificar se o link está absoluto, caso nao, ele ja substituir o href, o src ou backgroud... pq pela minha implementação, como podem ter visto, eu varro a string toda 1x para cada analise(ou seja, 1 vez para src, outra vez para href e outra para background) e isso pq ai tou considerando apenas apsas duplas... se for colocar aspas simples, dobrara o tempo de verificação.

ficou grandinho mas espero que esteja bem claro :)
qualquer duvida, podem falar :D"+getLink();
		String back2[] = init1.split("src=
so que ainda assim tem sites que vem defeituosos..
pq?
primeiro pq tem sites que usam aspas duplas  <img src="/img/tltl.gif" outros aidna usam aspas simples <img src='/img/tltl.gif'
outros tem partes que ja estao completos <img src="http://www.uol.com.br/img/tltl.gif" e nesses casos o programa também extrai e recoloca, perdendo tempo.

Entao minha pergunta é.. tem como ler os caracteres e numa cajadada , ja verificar se o link está absoluto, caso nao, ele ja substituir o href, o src ou backgroud... pq pela minha implementação, como podem ter visto, eu varro a string toda 1x para cada analise(ou seja, 1 vez para src, outra vez para href e outra para background) e isso pq ai tou considerando apenas apsas duplas... se for colocar aspas simples, dobrara o tempo de verificação.

ficou grandinho mas espero que esteja bem claro :)
qualquer duvida, podem falar :D");
		String init2 = back2[0];
		int tamanho2 = back2.length;
		for(int i=1; i<tamanho2; i++){
			init2 = init2 + comp5 + back2[i];
		}
		
		return init2;
	}
	
	/*
	 * Retorna o link, exemplo "http://www.fsm.com.br/fsmcurriculos/view/index.php"
	 * retorna "http://www.fsm.com.br/fsmcurriculos/view/"
	 */
	public String getLink() {
		int k = 0;
		ArrayList palavras = new ArrayList();
		String bufferTexto = this.url;
		int size = bufferTexto.length();
		for (int i = 0; i < size; i++) {
			if ((bufferTexto.substring(i, i + 1).equals("/"))) {
				palavras.add(bufferTexto.substring(k, i+1));
			} // fim do if
		} // fim do for
		int tam = palavras.size();
		return ((String)palavras.get(tam-1));
	}
so que ainda assim tem sites que vem defeituosos.. pq? primeiro pq tem sites que usam aspas duplas Entao minha pergunta é.. tem como ler os caracteres e numa cajadada só, ja verificar se o link está absoluto, caso nao, ele ja substituir o href, o src ou backgroud... pq pela minha implementação, como podem ter visto, eu varro a string toda 1x para cada analise(ou seja, 1 vez para src, outra vez para href e outra para background) e isso pq ai tou considerando apenas apsas duplas... se for colocar aspas simples, dobrara o tempo de verificação.

ficou grandinho mas espero que esteja bem claro :)
qualquer duvida, podem falar :D

10 Respostas

Dieval_Guizelini

Se eu entedi bem o que você quer,

pelo menos uma das coisas é enviar e-mail em formato html com imagens inclusas (embedded) correto?

Neste caso você pode dar uma olhada na api da SUN JavaMail:
http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html

Os e-mails devem ser multiparte, as imagens vão como anexo e são referenciadas por IDs. De qualquer forma você teria que fazer o processamento de substituição de URLs.

Neste caso vale a pena dar uma olhada em aplicações que fazem virtual proxy html… eles fazem o que você pretende fazer (eu acho).

fw

Ps: [editado] Para strings, pesquisas e substituições de uma olhada em expressões regulares, elas são muito rápidas e ajudam muito.[/editado]

R

Dieval Guizelini:
Se eu entedi bem o que você quer,

pelo menos uma das coisas é enviar e-mail em formato html com imagens inclusas (embedded) correto?

Neste caso você pode dar uma olhada na api da SUN JavaMail:
http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html

Os e-mails devem ser multiparte, as imagens vão como anexo e são referenciadas por IDs. De qualquer forma você teria que fazer o processamento de substituição de URLs.

Neste caso vale a pena dar uma olhada em aplicações que fazem virtual proxy html… eles fazem o que você pretende fazer (eu acho).

fw

Ps: [editado] Para strings, pesquisas e substituições de uma olhada em expressões regulares, elas são muito rápidas e ajudam muito.[/editado]


vlw pela resposta, mas tou usando o jakartamail, que tb az uso do javamail…
o que eu queria mesmo era melhorar o codigo da url…pq ele ja ta enviando nromal, mas o problema é que nem toda imagem esse acrescenta corretamente o link absoluto da imagem, sem contar, que como vc viu o codigo, ele faz etapas demais para cada parte…
fico no aguardo de alguma sugestao :slight_smile:

G

Eu acho que você terá que estudar expressões regulares…
Sempre que passei por isto, utilizei esta saída…

nbluis

gr_marco:
Eu acho que você terá que estudar expressões regulares…
Sempre que passei por isto, utilizei esta saída…

Inquestionável.

G

Se quiser um caminho, pode começar por aqui:
http://java.sun.com/docs/books/tutorial/essential/regex/index.html

:thumbup:

R

obrigado pessoal.
eu ja uso regex em partes do meu programa mas nao faço ideia de como usar nesse problema pq o q eu preciso é acrescentar o link sem mexer em mais nada no resto da estrutura e nao acrescentar quando ja tiver…

se vcs entrarem em alguns sites e mandar exibir o codigo fonte, vera q no msmo codigo tem src ou href que ta com o link absoluto completo e outras que esta apenas o relativo…
ai queria saer como otimizar isso… se ao percorrer a linha, ele ja verifique href, img src, backgroud e/ou outros que eu tenha esquecido que tb é necessario colocar o link completo…

agradeço a todos :slight_smile:

G

Use para efetuar um teste.

Se vc já tem o link capturado, verifica se ele está completo com regexp, caso contrário, concatena a string inicial pra completar o link.

é para ser bem genérico? para qualquer domínio? mesmo assim da pra criar uma expressão para identificar se o link possui algum domínio junto ou não…

T

Eu faria o seguinte se não fosse usar um parser HTML (que usei em uma solução parecida com o que você quer fazer):

  • Vejo se a linha contém um “<a” (indexOf é um pouco mais rápida que uma expressão regular) ou um “><img”.
  • Se ela tiver um “><a”, você pode usar as expressões regulares de sua preferência.
  • Deixe as expressões regulares pré-compiladas (use Pattern.compile).

Eu preferi usar um parser HTML para evitar alguns problemas que ocorrem quando você não consegue levar tudo em conta em suas expressões regulares - sempre sobra uma ponta solta (como um tag que em vez de ficar todo em uma linha, é quebrado em várias linhas, como:

><a 
   
 />

e isso é muito chato para consertar. Você acaba ficando com expressões regulares extremamente complexas e difíceis de manter.

R

thingol, o parse html que vc se refere seria isso?
http://sourceforge.net/project/showfiles.php?group_id=24399
com isso eu posso fazer o que pretendo??? como poderia ser???

T

Usando um parser HTML, você pode pegar o texto original, e efetuar as substituições de maneira simples. (Não usei esse parser que você mostrou no SourceForge.net; na verdade, eu peguei um código de um parser da Microsoft, muito bobo por sinal, e o alterei. É que tinha de pôr um parser dentro de uma applet e tinha muitas limitações de espaço.)

Criado 9 de julho de 2007
Ultima resposta 10 de jul. de 2007
Respostas 10
Participantes 5