由來
最近在做一個 Android 從其他客戶端分享 http url 到自己應用,然後以圖文消息的方式展示發送給自己的好友。通過 jsoup 把一些網頁信息圖片先爬出來做預覽。然後點擊可跳轉 webview 預覽全文
問題
遇到坑的問題比較多,例如很多網絡 jsoup 不一定能扒下來一下信息來預覽。另外一個比較棘手的是,由於各個應用通過:
String text =(String)getActivity().getIntent().getExtras().get(Intent.EXTRA_TEXT);
text 傳回來的 text 內容千變萬化。但是內部肯定包含一個可以訪問的 web url。
- UC新聞的 可能是 “某某新聞標題 http://xxxx”
- QQ閱讀器的可能是 “http://xxxxx 某某網頁摘要”
…… 等等
中間可能是以空格分割 或者 以中文逗號句號分開等等,無法完整準確有效的提取其中的 url
try {
String[] texts = text.split(" ");
for (String s : texts) { if (s.startsWith("http://") || s.startsWith("https://") || s.startsWith("HTTP://") || s.startsWith("HTTPS://")) {
link = s;
break;
}
}
if (TextUtils.isEmpty(link)) {
link = text.substring(text.indexOf("http"), text.length()); }
} catch (Exception e) {
e.printStackTrace();
}
我可能會去這樣。但是事實證明這樣只能過濾出部分應用。網上搜索也沒有比較好的辦法。
解決
最後同事的指點下 通過正則 Android 下 有 Patterns.WEB_URL; (Java開發可提取該正則表達式)
/**
* Regular expression pattern to match most part of RFC 3987
* Internationalized URLs, aka IRIs. Commonly used Unicode characters are
* added.
*/
public static final Pattern WEB_URL = Pattern.compile(
"((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)"
+ "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_"
+ "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?"
+ "(?:" + DOMAIN_NAME + ")"
+ "(?:\\:\\d{1,5})?)" // plus option port number
+ "(\\/(?:(?:[" + GOOD_IRI_CHAR + "\\;\\/\\?\\:\\@\\&\\=\\#\\~" // plus option query params
+ "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?"
+ "(?:\\b|$)");
Pattern pattern = Patterns.WEB_URL;
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
link = matcher.group(0);
}
最後測試了好一些應用都成功的提取了 url。 親測有效~!