嘗試用 indexOf/substring 從 HTML 字串中擷取 IP 位址,因 HTML 結構微調(換行、空白、屬性順序)導致解析失敗。
// 硬編碼字串位置,極度脆弱
int index = response_str.indexOf("Remote IP Address:");
index += "Remote IP Address:".length();
index += "</div><br /><div id=\"value1\">".length();
int end = response_str.indexOf("</div><br /><br />", index);
String strIP = response_str.substring(index, end);
// 針對目標 HTML 結構
Pattern pattern = Pattern.compile("Remote IP Address:.*?<div id=\"value1\">(.*?)</div>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(html);
if (matcher.find()) {
String ip = matcher.group(1).trim(); // 49.156.53.152
}
// build.gradle
implementation 'org.jsoup:jsoup:1.17.2'
// 程式碼
Document doc = Jsoup.parse(html);
Element ipDiv = doc.selectFirst("div#value1");
String ip = ipDiv != null ? ipDiv.text() : "";
優點:抗 HTML 格式變化、支援 CSS 選擇器、自動處理實體編碼。
String[] parts = html.split("\\*\\*"); // 若 IP 以 ** 包裹
if (parts.length > 1) String ip = parts[1];
DefaultHttpClient,改用 OkHttp + 協程/Flow。// OkHttp + 協程範例
suspend fun fetchIp(url: String): String = withContext(Dispatchers.IO) {
val response = OkHttpClient().newCall(Request.Builder().url(url).build()).execute()
val html = response.body?.string() ?: ""
Jsoup.parse(html).selectFirst("div#value1")?.text() ?: ""
}
永遠不要用字串索引硬解析 HTML/JSON/XML。選擇適合的結構化解析器(Jsoup、Gson、XmlPullParser),程式碼才能經得起版本迭代與格式微調。