Substring - por que não funciona?

4 respostas Resolvido
Fefo80

Prezados, bom dia. Tenho uma dúvida de por quê o código abaixo não funciona:

Substring

private static String retornarURL(String texto, String parametro) {
	String url;
	int posicaoInicial = 0, posicaoFinal;
	try { // tenta se for HTTPS
		posicaoInicial = texto.indexOf("https://" + parametro);
		System.out.println("HTTPS: posição = " + posicaoInicial);
	} catch (Exception e) { // pega se for HTTP
		System.out.println(e);
		posicaoInicial = texto.indexOf("http://" + parametro);
		System.out.println("HTTP: posição = " + posicaoInicial);
	} finally {
		posicaoFinal = texto.indexOf("\"", posicaoInicial);
		System.out.println("Posição inicial: " + posicaoInicial + " / final: " + posicaoFinal);
		System.out.println("URL 1: " + texto.substring(33954, 34011));
		System.out.println("URL 2: " + texto.substring(posicaoInicial, posicaoInicial));
		System.out.println("URL 3: " + url);
	}
	return url;
}

O código tem o propósito de identificar um link http://linkDeAlgumaCoisa.com.br/ dentro de um site.

Dentro do finally, ele mostra corretamente a posicaoInicial e a posicaoFinal; quando uso o print passando substring especificando os valores (URL 1), ele mostra corretamente o código.

MAS quando passo os parâmetros (mesmo as variáveis estando com o valor correto), não funciona.

Vocês têm alguma ideia do motivo de substring funcionar de forma explícita mas não por parâmetros?

Muito obrigado.

4 Respostas

hugokotsubo

Seria bom colocar alguns exemplos de texto (mas tente fazer uma versão reduzida, pois pelo que parece, o texto original é grande), com casos que funciona e não funciona.

Outro ponto é que não faz muito sentido usar try, pois indexOf não lança exceção se a string não for encontrada (ele retorna -1 quando não encontra).

Fefo80

O texto da

específica é:
<div id="pgc-40641-1-1"  class="panel-grid-cell" ><div id="panel-40641-1-1-0"
 class="so-panel widget widget_sb_homilia_widget panel-first-child panel-last-child"
 data-index="2" ><div class="wide-thumb-item desktop-medium-image">
<a class="link" href="https://homilia.cancaonova.com/?post_type=homilia&p=38870" target="_blank">

O trecho adaptado do código ficaria mais ou menos…

private static String exemplo = "<div id=\"pgc-40641-1-1\"  class=\"panel-grid-cell\" ><div id=\"panel-40641-1-1-0\"\r\n"
			+ " class=\"so-panel widget widget_sb_homilia_widget panel-first-child panel-last-child\"\r\n"
			+ " data-index=\"2\" ><div class=\"wide-thumb-item desktop-medium-image\">\r\n"
			+ "<a class=\"link\" href=\"https://homilia.cancaonova.com/?post_type=homilia&p=38870\" target=\"_blank\">\r\n"
			+ "		<div class=\"image-wrapper\">\r\n" + "			<picture>\r\n"
			+ "				<img width=\"512\" height=\"288\" src=\"https://img.cancaonova.com/cnimages/canais/uploads/sites/18/2020/11/Jesus-é-a-paz-necessária-para-nossa-vida-512x288.jpg\" class=\"attachment-Imagem Wide P size-Imagem Wide P wp-post-image\" alt=\"\" srcset=\"https://img.cancaonova.com/cnimages/canais/uploads/sites/18/2020/11/Jesus-é-a-paz-necessária-para-nossa-vida-512x288.jpg 512w, https://img.cancaonova.com/cnimages/canais/uploads/sites/18/2020/11/Jesus-é-a-paz-necessária-para-nossa-vida-384x216.jpg 384w, https://img.cancaonova.com/cnimages/canais/uploads/sites/18/2020/11/Jesus-é-a-paz-necessária-para-nossa-vida-768x432.jpg 768w, https://img.cancaonova.com/cnimages/canais/uploads/sites/18/2020/11/Jesus-é-a-paz-necessária-para-nossa-vida-600x338.jpg 600w\" sizes=\"(max-width: 512px) 100vw, 512px\" />			</picture>\r\n"
			+ "</div>\r\n";

	// pega um texto HTML, encontra a URL que quer coletar, e retorna ela
	private static String retornarURL(String texto, String parametro) {
		String novoTexto = exemplo;
		String novoParametro = "homilia";
		String url;
		int posicaoInicial = 0, posicaoFinal;
		if (novoTexto.indexOf("https://" + novoParametro) != -1) {
			posicaoInicial = novoTexto.indexOf("https://" + novoParametro);
			System.out.println("HTTPS: posição = " + posicaoInicial);
		} else {
			posicaoInicial = novoTexto.indexOf("http://" + novoParametro);
			System.out.println("HTTP: posição = " + posicaoInicial);
		}
		posicaoFinal = novoTexto.indexOf("\"", posicaoInicial);
		System.out.println("Posição inicial: " + posicaoInicial + " / final: " + posicaoFinal);
		url = novoTexto.substring(posicaoInicial, posicaoInicial);
		System.out.println("URL 1: " + novoTexto.substring(256, 313));
		System.out.println("URL 2: " + novoTexto.substring(posicaoInicial, posicaoInicial));
		System.out.println("URL 3: " + url);
		return url;
	}
hugokotsubo
Solucao aceita

Você usou a posicaoInicial duas vezes, mas tinha que usar a posicaoFinal:

novoTexto.substring(posicaoInicial, posicaoFinal)
//                                    aqui ^^^^^

Outro detalhe é que se não encontrar “https” nem “http”, a posicaoInicial será -1, então era bom ter outra verificação depois, antes de chamar substring.

Fefo80

#vergonha

Muito obrigado! Mil perdões pelo erro ridículo.

Criado 19 de novembro de 2020
Ultima resposta 19 de nov. de 2020
Respostas 4
Participantes 2