我正在创建一个简单的实用程序来从网页检索所有 HTTP URL。
最初我计划使用 HTML 解析库来解析 HREF 标记,但我知道我也需要检索脚本中包含的 URL(下面的示例脚本),因此我开始尝试正则表达式来从网页获取所有 HTTP url,但由于某种原因我的正则表达式无法正常工作。
URL 可以位于 JavaScript 内
<script>
if(jQuery.browser.msie)
{
var v= 'http://test.com/test/test';
}
</script>
我的程序:
try {
BufferedReader in=new BufferedReader(new FileReader("c:\\sample\\sample.html"));
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
String pattern = "http?://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)?";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(inputLine.replaceAll("http://", "\nhttp://"));
while (!m.hitEnd()) {
if (m.find()) {
System.out.println("Found value: " + m.group(0));
} else {
//System.out.println("NO MATCH");
}
}
}
in.close();
} catch (Exception e) {
e.printStackTrace();
}
有人可以帮助我解决此问题或让我知道从网页检索所有 URL 的最佳方法吗?
最佳答案
描述
你的表达有错别字。它应该使 s
成为可选。
https?://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)?
^
我还推荐:
- 将
(
...)
捕获组替换为非捕获组,例如(?:
...)
- 您不需要转义字符组
[.]
内的.
- 添加测试以确保您不会捕获网址周围的闭合引号
- 重写您的部分,将查找
/folder/subfolder
部分作为重复的非捕获组,查找初始斜杠,后跟文件夹名称
正则表达式:https?:\/\/(?:[\w-]+.)+(?::\d+)?(?:\/[\w\/_.]*)*?(?:\?\S+)?(?=['"\s])
作为 Java 字符串:"https?:\\/\\/(?:[\\w-]+.)+(?::\\d+)?(?:\\/[\\w\\/_.]*)*?(?:\\?\\S+)?(?=['\"\\s])"
示例
示例文本
<script>
if(jQuery.browser.msie)
{
var v= 'http://test.com/test/test';
}
</script>
<a class="test" href="http://blablablablabla.com">Third Link</a>
匹配
[0] => http://test.com/test/test
[1] => http://blablablablabla.com
关于java - 获取网页中所有HTTP url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18283369/