由来
最近在做一个 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。 亲测有效~!