Substring - por que não funciona?

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.

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

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;
	}

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.

1 curtida

#vergonha

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