जावास्क्रिप्ट के साथ पाठ में URL का पता लगाएं


151

क्या किसी के पास स्ट्रिंग के सेट में URL का पता लगाने के लिए सुझाव हैं?

arrayOfStrings.forEach(function(string){
  // detect URLs in strings and do something swell,
  // like creating elements with links.
});

अद्यतन: मैं लिंक का पता लगाने के लिए इस regex का उपयोग करके घाव ... जाहिर है कई वर्षों बाद।

kLINK_DETECTION_REGEX = /(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi

पूर्ण सहायक (वैकल्पिक हैंडलबार समर्थन के साथ) जीआईटी # 1654670 पर है


11
टीएलडी के एक सीमित सेट को सूचीबद्ध करने की कोशिश करना शायद अच्छा नहीं है, क्योंकि वे नए निर्माण करते रहते हैं।
मक्सी-बी

इस बात से सहमत। कभी-कभी हमें TLD के साथ अपडेट-सक्षम कोड की आवश्यकता होती है। दरअसल TLD को regex में जोड़ने के लिए स्क्रिप्ट का निर्माण किया जा सकता है या कोड में डायनेमिक कोड अपडेट TLD को अपडेट किया जा सकता है। जीवन में चीजों को TLD और Timezone की तरह मानकीकृत किया जाना है। वास्तविक विश्व उपयोग पते के मामले के लिए मौजूदा "TLDs" सत्यापन योग्य URL को सत्यापित करने के लिए परिमित नियंत्रण अच्छा हो सकता है।
एडवर्ड चैन JW

जवाबों:


217

पहले आपको एक अच्छे रेगेक्स की आवश्यकता होती है जो कि यूआरएल से मेल खाता हो। ऐसा करना कठिन है। यहाँ देखें , यहाँ और यहाँ :

... लगभग कुछ भी एक मान्य URL है। इसे विभाजित करने के लिए कुछ विराम चिह्न नियम हैं। किसी भी विराम चिह्न से दूर, आपके पास अभी भी एक मान्य URL है।

RFC को ध्यान से देखें और देखें कि क्या आप "अमान्य" URL का निर्माण कर सकते हैं। नियम बहुत लचीले हैं।

उदाहरण के लिए :::::एक मान्य URL है। रास्ता है ":::::"। एक सुंदर बेवकूफ नाम, लेकिन एक वैध फ़ाइल नाम।

इसके अलावा, /////एक मान्य URL है। Netloc ("hostname") है ""। रास्ता है "///"। फिर, बेवकूफ। भी मान्य है। यह URL सामान्य "///" करता है जो समकक्ष है।

जैसे कुछ "bad://///worse/////" पूरी तरह से मान्य है। गूंगा लेकिन मान्य।

वैसे भी, यह उत्तर आपको सर्वश्रेष्ठ रेगेक्स देने के लिए नहीं है, बल्कि यह भी है कि जावास्क्रिप्ट के साथ पाठ के अंदर स्ट्रिंग रैपिंग कैसे करें, इसका प्रमाण है।

ठीक है तो बस इस एक का उपयोग करने देता है: /(https?:\/\/[^\s]+)/g

फिर, यह एक बुरा रेगेक्स है । इसमें कई झूठी सकारात्मकताएँ होंगी। हालाँकि यह इस उदाहरण के लिए पर्याप्त है।

function urlify(text) {
  var urlRegex = /(https?:\/\/[^\s]+)/g;
  return text.replace(urlRegex, function(url) {
    return '<a href="' + url + '">' + url + '</a>';
  })
  // or alternatively
  // return text.replace(urlRegex, '<a href="$1">$1</a>')
}

var text = 'Find me at http://www.example.com and also at http://stackoverflow.com';
var html = urlify(text);

console.log(html)

// html now looks like:
// "Find me at <a href="http://www.example.com">http://www.example.com</a> and also at <a href="http://stackoverflow.com">http://stackoverflow.com</a>"

तो संक्षेप में प्रयास करें:

$$('#pad dl dd').each(function(element) {
    element.innerHTML = urlify(element.innerHTML);
});

4
"कई झूठी सकारात्मक" के कुछ उदाहरणों से इस उत्तर में बहुत सुधार होगा। अन्यथा भविष्य के Googlers को कुछ (शायद मान्य?) FUD के साथ छोड़ दिया जाता है।
cmcculloh

मुझे कभी नहीं पता था कि आप दूसरे पैराम के रूप में कार्य कर सकते हैं .replace: |
आमिर अफरीदी

4
यह अच्छा है, लेकिन text="Find me at http://www.example.com, and also at http://stackoverflow.com."दो 404 में विराम चिह्नों के साथ "गलत" बात करता है । कुछ उपयोगकर्ता इसके बारे में जानते हैं और विराम से बचने के लिए विराम चिह्न से पहले URL के बाद एक स्थान जोड़ देंगे, लेकिन अधिकांश लिंकफ़ायर मैं (Gmail, etherpad, phabricator) URL से अलग अनुरेखण विराम चिह्न का उपयोग करता हूं।
स्काईपेज पेज

यदि पाठ में पहले से ही लंगर युक्त url है तो आप फंक्शन रिमूवरएन्चर्स (टेक्स्ट) {var div = $ ('<div> </ div>') का उपयोग कर सकते हैं। html (पाठ); div.find ( 'एक') सामग्री () खोलना ()।। वापसी div.text (); } वापसी से पहले एंकरों को हटाने के लिए text.replace
मुनीब मिर्जा

यदि पाठ में पहले से ही एंकर युक्त url है, तो आप एंकर को हटाने के लिए jquery का उपयोग कर रहे हैं, लेकिन मैं Angular का उपयोग कर रहा हूं। मैं एंगुलर में लंगर कैसे हटा सकता हूं?
सचिन जगताप

132

यहाँ मैं अपने regex के रूप में उपयोग कर रहा हूँ:

var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;

इसमें URL में अनुगामी विराम चिह्न शामिल नहीं है। क्रिसेंट का कार्य एक आकर्षण की तरह काम करता है :) ताकि:

function linkify(text) {
    var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(urlRegex, function(url) {
        return '<a href="' + url + '">' + url + '</a>';
    });
}

4
अंत में एक रेगेक्स जो वास्तव में सबसे स्पष्ट मामले में काम करता है! यह एक बुकमार्क करने के योग्य है। जब तक मुझे यह नहीं मिल जाता तब तक मैंने गोगल्स खोज से हजारों उदाहरणों का परीक्षण किया।
इस्माइल

6
सरल और अच्छा! लेकिन urlRegexपरिभाषित किया जाना चाहिए बाहर linkify संकलन यह महंगा है के रूप में।
BM

1
यह पूर्ण URL का पता लगाने में विफल रहता है: disney.wikia.com/wiki/Pua_(Moana)
Jry9972

1
मैंने ()पात्रों की प्रत्येक सूची में जोड़ा और यह अब काम करता है।
गुइल्यूम एफ।

3
यह सिर्फ www के साथ शुरू होने वाले url का पता लगाने में विफल रहता है। पूर्व के लिए: www.facebook.com
CraZyDroiD

51

मैंने इस समस्या को काफी समय तक हल किया, फिर मेरे साथ यह हुआ कि एक Android तरीका है, android.text.util। सौभाग्य से, Android खुला स्रोत है।

वे विभिन्न प्रकार के url के मिलान के लिए कुछ अलग पैटर्न का उपयोग करते हैं। आप उन सभी को यहां पा सकते हैं: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/text/util/Retgex.java#Regex। 0WEB_URL_PATTERN

यदि आप केवल url के बारे में चिंतित हैं जो WEB_URL_PATTERN से मेल खाते हैं, अर्थात, वह url जो RFC 1738 युक्ति के अनुरूप है, तो आप इसका उपयोग कर सकते हैं:

/((?:(http|https|Http|Https|rtsp|Rtsp):\/\/(?:(?:[a-zA-Z0-9\$\-\_\.\+\!\*\'\(\)\,\;\?\&\=]|(?:\%[a-fA-F0-9]{2})){1,64}(?:\:(?:[a-zA-Z0-9\$\-\_\.\+\!\*\'\(\)\,\;\?\&\=]|(?:\%[a-fA-F0-9]{2})){1,25})?\@)?)?((?:(?:[a-zA-Z0-9][a-zA-Z0-9\-]{0,64}\.)+(?:(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(?:biz|b[abdefghijmnorstvwyz])|(?:cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(?:edu|e[cegrstu])|f[ijkmor]|(?:gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(?:info|int|i[delmnoqrst])|(?:jobs|j[emop])|k[eghimnrwyz]|l[abcikrstuvy]|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])|(?:name|net|n[acefgilopruz])|(?:org|om)|(?:pro|p[aefghklmnrstwy])|qa|r[eouw]|s[abcdeghijklmnortuvyz]|(?:tel|travel|t[cdfghjklmnoprtvwz])|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]))|(?:(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])))(?:\:\d{1,5})?)(\/(?:(?:[a-zA-Z0-9\;\/\?\:\@\&\=\#\~\-\.\+\!\*\'\(\)\,\_])|(?:\%[a-fA-F0-9]{2}))*)?(?:\b|$)/gi;

यहाँ स्रोत का पूरा पाठ है:

"((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)"
+ "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_"
+ "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?"
+ "((?:(?:[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}\\.)+"   // named host
+ "(?:"   // plus top level domain
+ "(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])"
+ "|(?:biz|b[abdefghijmnorstvwyz])"
+ "|(?:cat|com|coop|c[acdfghiklmnoruvxyz])"
+ "|d[ejkmoz]"
+ "|(?:edu|e[cegrstu])"
+ "|f[ijkmor]"
+ "|(?:gov|g[abdefghilmnpqrstuwy])"
+ "|h[kmnrtu]"
+ "|(?:info|int|i[delmnoqrst])"
+ "|(?:jobs|j[emop])"
+ "|k[eghimnrwyz]"
+ "|l[abcikrstuvy]"
+ "|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])"
+ "|(?:name|net|n[acefgilopruz])"
+ "|(?:org|om)"
+ "|(?:pro|p[aefghklmnrstwy])"
+ "|qa"
+ "|r[eouw]"
+ "|s[abcdeghijklmnortuvyz]"
+ "|(?:tel|travel|t[cdfghjklmnoprtvwz])"
+ "|u[agkmsyz]"
+ "|v[aceginu]"
+ "|w[fs]"
+ "|y[etu]"
+ "|z[amw]))"
+ "|(?:(?:25[0-5]|2[0-4]" // or ip address
+ "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]"
+ "|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]"
+ "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"
+ "|[1-9][0-9]|[0-9])))"
+ "(?:\\:\\d{1,5})?)" // plus option port number
+ "(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~"  // plus option query params
+ "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?"
+ "(?:\\b|$)";

यदि आप वास्तव में फैंसी होना चाहते हैं, तो आप ईमेल पते के लिए भी परीक्षण कर सकते हैं। ईमेल पतों के लिए regex है:

/[a-zA-Z0-9\\+\\.\\_\\%\\-]{1,256}\\@[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}(\\.[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25})+/gi

पुनश्च: शीर्ष स्तर के डोमेन जो रीगेक्स द्वारा समर्थित हैं, वे जून 2007 तक चालू हैं। अप टू डेट सूची के लिए आपको https://data.iana.org/TLD/tlds-alpha-by-domain.txt की जाँच करनी होगी ।


3
चूँकि आपके पास केस-असंवेदनशील नियमित अभिव्यक्ति है, इसलिए आपको निर्दिष्ट करने की आवश्यकता नहीं है a-zA-Zऔर http|https|Http|Https|rtsp|Rtsp
Ry-

4
यह अच्छा है, लेकिन मुझे यकीन नहीं है कि मैं कभी इसका इस्तेमाल करूंगा। अधिकांश उपयोग के मामलों के लिए, मैं TLD की हार्ड-कोडित सूची पर निर्भर होने वाले दृष्टिकोण का उपयोग करने के बजाय कुछ झूठी सकारात्मक बातें स्वीकार करूंगा। यदि आप TLD को अपने कोड में सूचीबद्ध करते हैं, तो आप गारंटी दे रहे हैं कि यह एक दिन अप्रचलित हो जाएगा, और मैं अपने कोड में भविष्य के रखरखाव को अनिवार्य नहीं बनाऊंगा अगर मैं इससे बच सकता हूं।
मार्क अमेरी

3
यह समय का 101% काम करता है, दुर्भाग्य से यह ऐसे यूआरएल भी पाता है जो एक स्थान से पहले नहीं हैं। अगर मैं hello@mydomain.com पर मैच चलाता हूं, तो यह 'mydomain.com' को पकड़ लेता है। क्या इस पर सुधार करने का कोई तरीका है, केवल इसे पकड़ने के लिए अगर इसके पहले एक स्थान है?
डेमिनिटिक्स

यह भी ध्यान दें, यह दर्ज किए गए उपयोगकर्ता को पकड़ने के लिए एकदम सही है
Deminetix

ध्यान दें कि grepcode.com अब नहीं है, यहां मुझे लगता है कि Android स्रोत कोड में सही जगह के लिए एक लिंक है। मुझे लगता है कि रेगेक्स एंड्रॉइड 2013 (मूल पोस्ट) के बाद से अपडेट किया जा सकता है, लेकिन 2015 के बाद से अपडेट नहीं हुआ है और इसलिए कुछ नए टीएलडी गायब हो सकते हैं।
जेम्स

19

वर्धमान ताजा जवाब पर आधारित

यदि आप http: // या बिना http: // और www से लिंक का पता लगाना चाहते हैं आप निम्नलिखित का उपयोग कर सकते हैं

function urlify(text) {
    var urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g;
    //var urlRegex = /(https?:\/\/[^\s]+)/g;
    return text.replace(urlRegex, function(url,b,c) {
        var url2 = (c == 'www.') ?  'http://' +url : url;
        return '<a href="' +url2+ '" target="_blank">' + url + '</a>';
    }) 
}

यह एक अच्छा समाधान है, लेकिन मैं यह भी जांचना चाहता हूं कि पाठ में पहले से ही एचआरई नहीं होना चाहिए। मैंने इस regex = /( / -href)((https?:\/\/).html(www\.).html(mailto:)) कोशिश की। क्या आप इसके लिए मेरी मदद कर सकते हैं या फिर उपरोक्त रेगेक्स काम क्यों नहीं कर रहा है।
सचिन जगताप

मुझे लगता है कि आपने लौटे आउटपुट में लक्ष्य = "रिक्त" जोड़ दिया है। यह संस्करण वही है जो मैं चाहता था। कुछ भी नहीं शीर्ष पर (अन्यथा मैं Linkifyjs का उपयोग करेंगे) बस सबसे लिंक पाने के लिए पर्याप्त है।
माइकल कुबेर

18

एनपीएम पर यह पुस्तकालय ऐसा लगता है जैसे यह बहुत व्यापक है https://www.npmjs.com/package/linkifyjs

सरल पाठ में URL खोजने और उन्हें HTML लिंक में परिवर्तित करने के लिए Linkify एक छोटा सा व्यापक जावास्क्रिप्ट प्लगइन है। यह सभी मान्य URL और ईमेल पतों के साथ काम करता है।


4
मैंने अभी-अभी अपने प्रोजेक्ट में linkifyjs को लागू किया है और यह शानदार है। इस सवाल पर Linkifyjs का जवाब होना चाहिए। एक दूसरे को देखने के लिए github.com/twitter/twitter-text
उबेर schnoz

6

छवियों को प्रस्तुत करने के लिए फ़ंक्शन को और बेहतर बनाया जा सकता है:

function renderHTML(text) { 
    var rawText = strip(text)
    var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   

    return rawText.replace(urlRegex, function(url) {   

    if ( ( url.indexOf(".jpg") > 0 ) || ( url.indexOf(".png") > 0 ) || ( url.indexOf(".gif") > 0 ) ) {
            return '<img src="' + url + '">' + '<br/>'
        } else {
            return '<a href="' + url + '">' + url + '</a>' + '<br/>'
        }
    }) 
} 

या एक थंबनेल छवि के लिए जो फीका आकार की छवि के लिए लिंक करती है:

return '<a href="' + url + '"><img style="width: 100px; border: 0px; -moz-border-radius: 5px; border-radius: 5px;" src="' + url + '">' + '</a>' + '<br/>'

और यहाँ स्ट्रिप () फ़ंक्शन है जो किसी भी मौजूदा HTML को हटाकर एकरूपता के लिए टेक्स्ट स्ट्रिंग को प्री-प्रोसेस करता है।

function strip(html) 
    {  
        var tmp = document.createElement("DIV"); 
        tmp.innerHTML = html; 
        var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   
        return tmp.innerText.replace(urlRegex, function(url) {     
        return '\n' + url 
    })
} 

2
let str = 'https://example.com is a great site'
str.replace(/(https?:\/\/[^\s]+)/g,"<a href='$1' target='_blank' >$1</a>")

लघु कोड बड़ा काम! ...

परिणाम:-

 <a href="https://example.com" target="_blank" > https://example.com </a>

1

मौजूदा npm पैकेज है: url-regex , बस इसे निम्नलिखित के साथ इंस्टॉल करें yarn add url-regexया npm install url-regexउपयोग करें:

const urlRegex = require('url-regex');

const replaced = 'Find me at http://www.example.com and also at http://stackoverflow.com or at google.com'
  .replace(urlRegex({strict: false}), function(url) {
     return '<a href="' + url + '">' + url + '</a>';
  });

0

tmp.innerText अपरिभाषित है। आपको tmp.innerHTML का उपयोग करना चाहिए

function strip(html) 
    {  
        var tmp = document.createElement("DIV"); 
        tmp.innerHTML = html; 
        var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   
        return tmp.innerHTML .replace(urlRegex, function(url) {     
        return '\n' + url 
    })

0

इसे इस्तेमाल करे:

function isUrl(s) {
    if (!isUrl.rx_url) {
        // taken from https://gist.github.com/dperini/729294
        isUrl.rx_url=/^(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i;
        // valid prefixes
        isUrl.prefixes=['http:\/\/', 'https:\/\/', 'ftp:\/\/', 'www.'];
        // taken from https://w3techs.com/technologies/overview/top_level_domain/all
        isUrl.domains=['com','ru','net','org','de','jp','uk','br','pl','in','it','fr','au','info','nl','ir','cn','es','cz','kr','ua','ca','eu','biz','za','gr','co','ro','se','tw','mx','vn','tr','ch','hu','at','be','dk','tv','me','ar','no','us','sk','xyz','fi','id','cl','by','nz','il','ie','pt','kz','io','my','lt','hk','cc','sg','edu','pk','su','bg','th','top','lv','hr','pe','club','rs','ae','az','si','ph','pro','ng','tk','ee','asia','mobi'];
    }

    if (!isUrl.rx_url.test(s)) return false;
    for (let i=0; i<isUrl.prefixes.length; i++) if (s.startsWith(isUrl.prefixes[i])) return true;
    for (let i=0; i<isUrl.domains.length; i++) if (s.endsWith('.'+isUrl.domains[i]) || s.includes('.'+isUrl.domains[i]+'\/') ||s.includes('.'+isUrl.domains[i]+'?')) return true;
    return false;
}

function isEmail(s) {
    if (!isEmail.rx_email) {
        // taken from http://stackoverflow.com/a/16016476/460084
        var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
        var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
        var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
        var sQuotedPair = '\\x5c[\\x00-\\x7f]';
        var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
        var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
        var sDomain_ref = sAtom;
        var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
        var sWord = '(' + sAtom + '|' + sQuotedString + ')';
        var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
        var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
        var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
        var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

        isEmail.rx_email = new RegExp(sValidEmail);
    }

    return isEmail.rx_email.test(s);
}

भी यूआरएल पहचान लेगा जैसे google.com, http://www.google.bla, http://google.bla, www.google.blaनहीं लेकिनgoogle.bla


0

सामान्य url प्रतिमान निकालने के लिए आप इस तरह से एक रेगेक्स का उपयोग कर सकते हैं।

(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})

यदि आपको अधिक परिष्कृत पैटर्न की आवश्यकता है, तो इस तरह से एक पुस्तकालय का उपयोग करें।

https://www.npmjs.com/package/pattern-dreamer


इसका उद्देश्य क्या है (?:www\.|(?!www))? wwwww.comअमान्य क्यों होना चाहिए?
टोटो

तुम सही हो। वास्तव में मैं बस इसे ले लिया के रूप में कई regex का उपयोग करें। मैं ऊपर लिंक की गई लाइब्रेरी का उपयोग करने की सलाह दूंगा। हमें url डिटेक्शन में कई मामलों पर विचार करना चाहिए, इसलिए रेगेक्स अधिक जटिल होना चाहिए।
कांग एंड्रयू

0

सामान्य वस्तु उन्मुख समाधान

मेरे जैसे लोगों के लिए, जो कोणीय जैसे चौखटे का उपयोग करते हैं जो सीधे DOM को हेरफेर करने की अनुमति नहीं देते हैं, मैंने एक फ़ंक्शन बनाया जो एक स्ट्रिंग लेता है और एक सरणी url/ plainTextऑब्जेक्ट देता है जिसका उपयोग किसी भी UI प्रतिनिधित्व को बनाने के लिए किया जा सकता है जो आप चाहते हैं।

URL regex

मेरे द्वारा उपयोग किए गए URL मिलान के लिए (थोड़ा अनुकूलित) h0mayunregex:/(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g

मेरा कार्य भी URL के अंत से विराम चिह्नों को छोड़ता है जैसे कि .और ,मुझे विश्वास है कि अधिक बार एक कानूनी URL समाप्ति की तुलना में वास्तविक विराम चिह्न होगा (लेकिन यह हो सकता है! यह कठोर विज्ञान नहीं है क्योंकि अन्य उत्तर अच्छी तरह से समझाते हैं) इसके लिए मैं आवेदन करता हूं! मिलान किए गए URL पर regex का अनुसरण करना /^(.+?)([.,?!'"]*)$/

टाइपस्क्रिप्ट कोड

    export function urlMatcherInText(inputString: string): UrlMatcherResult[] {
        if (! inputString) return [];

        const results: UrlMatcherResult[] = [];

        function addText(text: string) {
            if (! text) return;

            const result = new UrlMatcherResult();
            result.type = 'text';
            result.value = text;
            results.push(result);
        }

        function addUrl(url: string) {
            if (! url) return;

            const result = new UrlMatcherResult();
            result.type = 'url';
            result.value = url;
            results.push(result);
        }

        const findUrlRegex = /(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g;
        const cleanUrlRegex = /^(.+?)([.,?!'"]*)$/;

        let match: RegExpExecArray;
        let indexOfStartOfString = 0;

        do {
            match = findUrlRegex.exec(inputString);

            if (match) {
                const text = inputString.substr(indexOfStartOfString, match.index - indexOfStartOfString);
                addText(text);

                var dirtyUrl = match[0];
                var urlDirtyMatch = cleanUrlRegex.exec(dirtyUrl);
                addUrl(urlDirtyMatch[1]);
                addText(urlDirtyMatch[2]);

                indexOfStartOfString = match.index + dirtyUrl.length;
            }
        }
        while (match);

        const remainingText = inputString.substr(indexOfStartOfString, inputString.length - indexOfStartOfString);
        addText(remainingText);

        return results;
    }

    export class UrlMatcherResult {
        public type: 'url' | 'text'
        public value: string
    }

0

यदि आप http: // या बिना http के लिंक का पता लगाना चाहते हैं: // या ftp या अन्य संभावित मामलों जैसे अंत में पीछे चल रहे विराम चिह्न को हटा दें, तो इस कोड को देखें।

https://jsfiddle.net/AndrewKang/xtfjn8g3/

एनपीएम का उपयोग करने का एक सरल तरीका है

npm install --save url-knife
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.