2009-12-15 14 views
9

के साथ टेक्स्ट यूआरएल को प्रतिस्थापित करना मैं स्ट्रिंग को प्रतिस्थापित करने के साथ कुछ सामान करने की कोशिश कर रहा हूं जिसमें कुछ यूआरएल ब्राउज़र संगत लिंक किए गए यूआरएल हैं।जावा: क्लिक करने योग्य HTML लिंक

मेरे प्रारंभिक स्ट्रिंग इस तरह दिखता है:

"hello, i'm some text with an url like <a href="http://www.the-url.com/">http://www.the-url.com/</a> and I need to have an hypertext link !" 

मैं इस कोड लाइन के साथ यूआरएल पकड़ कर सकते हैं:

String withUrlString = myString.replaceAll(".*://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"null\">HereWasAnURL</a>"); 
एक स्ट्रिंग की तरह लग रही

"hello, i'm some text with an url like http://www.the-url.com/ and I need to have an hypertext link !" 

क्या मैं प्राप्त करना चाहते है

शायद regexp अभिव्यक्ति को कुछ सुधार की आवश्यकता है, लेकिन यह ठीक काम कर रहा है, आगे की जांच करने की आवश्यकता है। आपकी रुचि और प्रतिक्रिया के लिए अग्रिम में

धन्यवाद catched स्ट्रिंग:

तो सवाल यह है कि अभिव्यक्ति regexp द्वारा catched बनाए रखना और केवल क्या लिंक बनाने के लिए क्या एक जोड़ने है!

myString.replaceAll("(.*://[^<>[:space:]]+[[:alnum:]/])", "<a href=\"$1\">HereWasAnURL</a>"); 

मैं अपने रेगुलर एक्सप्रेशन से जांच नहीं की:

+0

नीचे जवाब आप की मदद करनी चाहिए, वहीं मैं सुझाव है कि आप जॉन Gruber के नियमित अभिव्यक्ति पर एक नज़र "जंगली में" सभी रूपों में दिखाई देने वाले यूआरएल पर कब्जा करने के लिए है: http: //daringfireball.net/2009/11/liberal_regex_for_matching_urls – FRotthowe

उत्तर

7

उपयोग करने के लिए प्रयास करें।

() का उपयोग करके आप समूह बना सकते हैं। $1 समूह अनुक्रमणिका इंगित करता है। $1 यूआरएल को प्रतिस्थापित करेगा। my question
कुछ exemples: Capturing Text in a Group in a regular expression

+0

यह ठीक काम करता है! बहुत धन्यवाद: डी – Dough

+0

यह टेक्स्ट में एकाधिक लिंक के लिए काम नहीं करता है क्योंकि '। * 'बहुत अधिक लेता है। – Sonson123

1

अपने रेगुलर एक्सप्रेशन से मान लिया जाये कि सही जानकारी पर कब्जा करने के काम करता है, तो आप अपने प्रतिस्थापन में backreferences उपयोग कर सकते हैं

मैं एक simalir सवाल पूछा था। Java regexp tutorial देखें।

उस मामले में, तुम क्या चाहते हैं

 
myString.replaceAll(....., "<a href=\"\1\">\1</a>") 
6
public static String textToHtmlConvertingURLsToLinks(String text) { 
    if (text == null) { 
     return text; 
    } 

    String escapedText = HtmlUtils.htmlEscape(text); 

    return escapedText.replaceAll("(\\A|\\s)((http|https|ftp|mailto):\\S+)(\\s|\\z)", 
     "$1<a href=\"$2\">$2</a>$4"); 
} 

वहां बेहतर REGEXs हो सकता है लेकिन इस URL या समाप्त होने के बाद जब तक सफेद जगह नहीं है के रूप में काम कर देता है यूआरएल पाठ के अंत में है। यह विशेष कार्यान्वयन भी किसी अन्य HTML से बचने के लिए org.springframework.web.util.Html उपयोग करता है जो दर्ज किया गया हो सकता है।

+0

दो लिंक के लिए काम नहीं करता है जो सिर्फ एक स्थान से अलग होते हैं। – Sonson123

4

किसी भी व्यक्ति जो अधिक मजबूत समाधान खोज रहा है, मैं Twitter Text Libraries का सुझाव दे सकता हूं।

इस पुस्तकालय के साथ यूआरएल की जगह इस तरह काम करता है:

new Autolink().autolink(plainText) 
+0

यूआरएल अच्छी तरह से स्वरूपित होना चाहिए। पता लगाने में असमर्थ: www.example.com (http: // गायब)। :( – redochka

0

बहु पाठ के मामले में आप इस का उपयोग कर सकते हैं:

text.replaceAll("(\\s|\\^|\\A)((http|https|ftp|mailto):\\S+)(\\s|\\$|\\z)", 
     "$1<a href='$2'>$2</a>$4"); 

और यहाँ मेरे कोड से भरा उदाहरण है जहाँ मैं करने की जरूरत है Belows कोड लिंक की जगह "http" या "https", एल के साथ शुरू

private static final Pattern urlPattern = Pattern.compile(
     "(\\s|\\^|\\A)((http|https|ftp|mailto):\\S+)(\\s|\\$|\\z)"); 


String userText = ""; // user content from db 
String replacedValue = HtmlUtils.htmlEscape(userText); 
replacedValue = urlPattern.matcher(replacedValue).replaceAll("$1<a href=\"$2\">$2</a>$4"); 
replacedValue = StringUtils.replace(replacedValue, "\n", "<br>"); 
System.out.println(replacedValue); 
2

: यूआरएल साथ प्रयोक्ता के पोस्ट उस में दिखाने स्याही सिर्फ "www" से शुरू हो रही है। और अंत में ईमेल लिंक भी बदल देता है।

Pattern httpLinkPattern = Pattern.compile("(http[s]?)://(www\\.)?([\\S&&[^[email protected]]]+)(\\.[\\S&&[^@]]+)"); 

    Pattern wwwLinkPattern = Pattern.compile("(?<!http[s]?://)(www\\.+)([\\S&&[^[email protected]]]+)(\\.[\\S&&[^@]]+)"); 

    Pattern mailAddressPattern = Pattern.compile("[\\S&&[^@]][email protected]([\\S&&[^[email protected]]]+)(\\.[\\S&&[^@]]+)"); 

    String textWithHttpLinksEnabled = 
    "ajdhkas www.dasda.pl/asdsad?asd=sd www.absda.pl [email protected] klajdld http://dsds.pl httpsda http://www.onet.pl https://www.onsdas.plad/dasda"; 

    if (Objects.nonNull(textWithHttpLinksEnabled)) { 

     Matcher httpLinksMatcher = httpLinkPattern.matcher(textWithHttpLinksEnabled); 
     textWithHttpLinksEnabled = httpLinksMatcher.replaceAll("<a href=\"$0\" target=\"_blank\">$0</a>"); 

     final Matcher wwwLinksMatcher = wwwLinkPattern.matcher(textWithHttpLinksEnabled); 
     textWithHttpLinksEnabled = wwwLinksMatcher.replaceAll("<a href=\"http://$0\" target=\"_blank\">$0</a>"); 

     final Matcher mailLinksMatcher = mailAddressPattern.matcher(textWithHttpLinksEnabled); 
     textWithHttpLinksEnabled = mailLinksMatcher.replaceAll("<a href=\"mailto:$0\">$0</a>"); 

     System.out.println(textWithHttpLinksEnabled); 
    } 

प्रिंटों:

ajdhkas <a href="http://www.dasda.pl/asdsad?asd=sd" target="_blank">www.dasda.pl/asdsad?asd=sd</a> <a href="http://www.absda.pl" target="_blank">www.absda.pl</a> <a href="mailto:[email protected]">[email protected]</a> klajdld <a href="http://dsds.pl" target="_blank">http://dsds.pl</a> httpsda <a href="http://www.onet.pl" target="_blank">http://www.onet.pl</a> <a href="https://www.onsdas.plad/dasda" target="_blank">https://www.onsdas.plad/dasda</a>