2011-03-04 2 views
1

때때로 URL과 전자 메일 주소가 포함 된 구조화되지 않은 일반 텍스트 (HTML 없음)가 포함 된 문자열을 생각해보십시오. 이 문자열의 모든 URL과 전자 메일 주소를 각각의 URL과 전자 메일 주소 (mailto-links)를 가리키는 HTML 링크로 변환하려고합니다.인라인 URL 및 전자 메일 주소를 Java 링크로 변환

Java에서이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

2

이 작동합니다 :

import java.text.MessageFormat; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

/** 
* 
* @author Sebastian Sdorra 
*/ 
public class TokenTextParser 
{ 
    private static final Pattern REGEX_URL = 
    Pattern.compile(
     "\\(?\\b((?:https?://|ftps?://|mailto:|www[.])[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|])"); 

    private static final String REPLACE_URL = 
    "<a target=\"_blank\" href=\"{1}\">{0}</a>"; 

    public String parseText(String content) 
    { 
    Matcher m = REGEX_URL.matcher(content); 
    List<Token> tokens = new ArrayList<Token>(); 
    int position = 0; 
    String tokenContent = null; 

    while (m.find()) 
    { 
     int start = m.start(); 
     int end = m.end(); 
     String replacement = m.group(); 

     if (replacement.startsWith("www")) 
     { 
     replacement = "http://" + replacement; 
     } 

     tokenContent = content.substring(position, start); 
     tokens.add(new Token(tokenContent)); 
     tokenContent = content.substring(start, end); 
     tokens.add(new Token(tokenContent, replacement)); 
     position = end; 
    } 

    tokenContent = content.substring(position, content.length()); 
    tokens.add(new Token(tokenContent)); 

    StringBuilder buffer = new StringBuilder(); 

    for (Token token : tokens) 
    { 
     if (token.getReplacement() != null) 
     { 
     buffer.append(MessageFormat.format(REPLACE_URL, token.getValue(), 
              token.getReplacement())); 
     } 
     else 
     { 
     buffer.append(token.getValue().replace("<", "&lt;").replace(">", 
       "&gt;")); 
     } 
    } 

    return buffer.toString(); 
    } 

    private static class Token 
    { 

    public Token(String value) 
    { 
     this.value = value; 
    } 

    public Token(String value, String replacement) 
    { 
     this.value = value; 
     this.replacement = replacement; 
    } 

    public String getReplacement() 
    { 
     return replacement; 
    } 

    public String getValue() 
    { 
     return value; 
    } 

    private String replacement; 
    private String value; 
    } 
} 
+0

+1 : 우수한 솔루션입니다! – knorv

관련 문제