Java: использование регулярных выражений для поиска URL-адресов, превращающих их в HTML-ссылки.Также определите, содержит ли ссылка http://,. Если нет, добавьте ее - PullRequest
2 голосов
/ 22 марта 2011

Я знаю, что эти вопросы часто задают, и Kelly Chan действительно дал ответ, который мне подходит, однако есть небольшая проблема, которая, я надеюсь, сообщество сможет мне помочь.

Например, если пользователь вводит это:

Please visit www.google.com

Тогда я хочу преобразовать это в

Please visit <a href="http://www.google.com">www.google.com</a>

ПРИМЕЧАНИЕ : исходный текст содержит только www.google.com, но я каким-то образом обнаружил, что перед ним должен стоять http://. поэтому ссылка становится <a href="http://www.google.com">www.google.com</a>. Если ссылка http://www.google.com, тогда мне просто нужно обернуть ее вокруг <a href>.

РЕДАКТИРОВАТЬ : Kelly Chan пересмотрела свой ответ, и это работает. Ниже приведено решение.

    Pattern patt = Pattern.compile("(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\".,<>???“”‘’]))");
    Matcher matcher = patt.matcher(this.mytext);    
    if(matcher.find()){
        if (matcher.group(1).startsWith("http://")){
            return matcher.replaceAll("<a href=\"$1\">$1</a>");
        }else{
            return matcher.replaceAll("<a href=\"http://$1\">$1</a>");
        }   
    }else{
        return this.mytext
    }

1 Ответ

3 голосов
/ 22 марта 2011

Вы можете инкапсулировать mytext в объект (скажем, MyTextTO). Затем вы реализуете метод (скажем, getLinkifiedMyText()) для возврата связанного формата mytext на MyTextTO.Ваш MBean должен иметь ArrayList<MyTextTO> для хранения списка MyTextTO, который будет отображаться в вашем JSF с использованием <h:dataTable>.После привязки значения <h:outputText> к getLinkifiedMyText() можно отобразить связанный текст.

Я ссылаюсь на эту ссылку для реализации getLinkifiedMyText():

public class MyTextTO{
        private String mytext;

       /**Getters , setters and constructor**/

        public String getLinkifiedMyText(){

            try {
                    Pattern patt = Pattern.compile("(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\".,<>???“”‘’]))");
                    Matcher matcher = patt.matcher(this.mytext);    

                    if (matcher.group(1).startsWith("http://")){
                                return matcher.replaceAll("<a href=\"$1\">$1</a>");
                    }else{
                            return matcher.replaceAll("<a href=\"http://$1\">$1</a>");
                    }   
            } catch (Exception e) {
               return this.mytext;
            }
        }
}



<h:dataTable  value="#{bean.dataList}" var="row">
    <h:column>  
        <h:outputText value="#{row.linkifiedMyText}" escape="false" />
    </h:column>
</h:dataTable>
...