2014-01-21 123 views
-1

我正在尝试创建一个程序,用于在文本文件中查找任何类型的URL,例如hxxp://www.testsite.com/images/logo.png。下面的代码是我在尝试扩充在线教程的时候(主要是在我的代码之上引用的),但是我一直无法捕获任何/所有的URL,包括那些嵌入在html标签中的URL。我会很感激任何帮助或建议,我可以尝试。谢谢。寻找URL的正则表达式

/* Reference: http://www.vogella.com/tutorials/JavaRegularExpressions/article.html 
*/ 
package de.vogella.regex.weblinks; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class LinkGetter { 

//variables 
private Pattern htmltag; 
private Pattern link; 

public LinkGetter() { 
    //Patterns. 
    htmltag = Pattern.compile("<a\\b[^>]*href=\"[^>]*>(.*?)</a>"); 
    link = Pattern.compile(
"((https?|ftp|gopher|telnet|file):((//)|(\\\\))+[\\w\\d:#@%/;$()~_?\\+-=\\\\\\.&]*)"); 

} 

public static void main(String[] args){ 

    String filepath ="TestFile.rtf"; 

    System.out.println(new LinkGetter().getLinks(filepath)); 

} 


public List<String> getLinks(String filepath) { 
    List<String> links = new ArrayList<String>(); 
    try { 
     FileReader FR = new FileReader("TestFile.rtf"); 
     BufferedReader bufferedReader = new BufferedReader(FR); 

     String A; 
     StringBuilder builder = new StringBuilder(); 
     while ((A = bufferedReader.readLine()) != null) { 
      builder.append(A); 
     } 

     Matcher tagmatch = htmltag.matcher(builder.toString()); 
     while (tagmatch.find()) { 
      Matcher matcher = link.matcher(tagmatch.group()); 
      matcher.find(); 
      String link = matcher.group().replaceFirst("href=\"", "") 
        .replaceFirst("\">", "") 
        .replaceFirst("\"[\\s]?target=\"[a-zA-Z_0-9]*", ""); 


      if (valid(link)) { 
       links.add(makeAbsolute(filepath, link)); 

      } 

      bufferedReader.close(); 
     } 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return links; 

} 

private boolean valid(String A) { 
    if (A.matches("javascript:.*|mailto:.*")) { 
     return false; 
    } 
    return true; 
} 

private String makeAbsolute(String filepath, String link) { 
    if (link.matches("http://.*")) { 
     return link; 
    } 
    else if (link.matches("/.*") || link.matches(".*$[^/]")) { 
     return "/" + link; 

    throw new RuntimeException("Cannot make absolute. File: " + filepath 
      + " Link " + link); 
} 


} 
+1

你真的需要给我们一些不起作用的测试用例。查看代码以查找不起作用的输入是[so]的主题。相关问题 - [什么是最好的正则表达式来检查一个字符串是否是一个有效的URL?](http://stackoverflow.com/questions/161738/what-is-the-best-regular-expression-to-check-如果-一个字符串,是一个有效的URL) – Dukeling

回答

1

你可以试试:

(https?|ftp|gopher|telnet|file):\/\/([\w\-_]+(?:(?:\.[\w\-_]+)+))([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])? 
0

我用这一个在我的旧项目之一。应该管用。

String regex="\\s*(?i)href\\s*=\\s*(\"([^\"]*\")|'[^']*'|([^'\">\\s]+))"; 
Pattern pattern = Pattern.compile(regex);