Rileva gli URL nel testo con JavaScript


151

Qualcuno ha suggerimenti per il rilevamento di URL in una serie di stringhe?

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

Aggiornamento: ho finito con questo regex per il rilevamento dei link ... Apparentemente diversi anni dopo.

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

L'helper completo (con supporto per manubrio opzionale) è al numero 1654670 .


11
Probabilmente non è una buona idea provare a elencare un set finito di TLD, poiché continuano a crearne di nuovi.
Maxy-B,

Essere d'accordo. A volte abbiamo bisogno di un codice aggiornabile con TLD. In realtà può essere lo script di build per aggiungere TLD in regex o TLD di aggiornamento di codice dinamico nel codice. Ci sono cose nella vita che devono essere standardizzate come TLD e fuso orario. Il controllo finito potrebbe essere utile per verificare l'URL verificabile "TLD" esistente per il caso d'uso dell'indirizzo del mondo reale.
Edward Chan JW,

Risposte:


217

Per prima cosa hai bisogno di una buona regex che corrisponda agli URL. Questo è difficile da fare. Vedi qui , qui e qui :

... quasi tutto è un URL valido. Ci sono alcune regole di punteggiatura per dividerlo. In assenza di punteggiatura, hai ancora un URL valido.

Controlla attentamente l'RFC e vedi se riesci a costruire un URL "non valido". Le regole sono molto flessibili.

Ad esempio :::::è un URL valido. Il percorso è ":::::". Un nome file piuttosto stupido, ma un nome file valido.

Inoltre, /////è un URL valido. Il netloc ("hostname") è "". Il percorso è "///". Ancora una volta, stupido. Valido anche Questo URL si normalizza a "///" quale è l'equivalente.

Qualcosa del genere "bad://///worse/////" è perfettamente valido. Stupido ma valido.

Comunque, questa risposta non ha lo scopo di darti la migliore regex ma piuttosto una prova di come eseguire il wrapping delle stringhe all'interno del testo, con JavaScript.

OK, quindi usiamo solo questo: /(https?:\/\/[^\s]+)/g

Ancora una volta, questa è una cattiva regex . Avrà molti falsi positivi. Tuttavia è abbastanza buono per questo esempio.

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>"

Quindi, in sintesi, prova:

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

4
Alcuni esempi dei "molti falsi positivi" migliorerebbero notevolmente questa risposta. Altrimenti i googler futuri resteranno solo con un FUD (forse valido?).
cmcculloh,

Non ho mai saputo che puoi passare la funzione come secondo parametro per .replace: |
Aamir Afridi,

4
Va bene, ma fa la cosa "sbagliata" con la punteggiatura finale text="Find me at http://www.example.com, and also at http://stackoverflow.com."in due 404. Alcuni utenti ne sono consapevoli e aggiungeranno uno spazio dopo gli URL prima della punteggiatura per evitare la rottura, ma la maggior parte dei linkificatori che utilizzo (Gmail, etherpad, phabricator) separano la punteggiatura finale dall'URL.
skierpage

Nel caso in cui il testo contenga già un URL ancorato puoi utilizzare la funzione removeAnchors (testo) {var div = $ ('<div> </div>') .html (testo); div.find ( 'a') contenuti () unwrap ()..; return div.text (); } per rimuovere le ancore prima di restituire text.replace
Muneeb Mirza,

Se il testo contiene già URL ancorato, stai usando jquery per rimuovere l'ancora, ma sto usando Angular. Come posso rimuovere l'ancora in Angolare?
Sachin Jagtap,

132

Ecco cosa ho finito per usare come regex:

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

Ciò non include la punteggiatura finale nell'URL. La funzione di Crescent funziona come un fascino :) quindi:

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
Finalmente un regex che funziona davvero nel caso più ovvio! Questo merita un segnalibro. Ho testato migliaia di esempi dalla ricerca su Google fino a quando non lo trovo.
Ismael,

6
Semplice e carino! Ma urlRegexdovrebbe essere definito all'esterno linkify come compilarlo è costoso.
BM,

1
Questo non riesce a rilevare l'URL completo: disney.wikia.com/wiki/Pua_(Moana)
Jry9972

1
Ho aggiunto ()in ogni elenco di caratteri e funziona ora.
Guillaume F.

3
non riesce a rilevare un URL che inizia solo con www. per esempio: www.facebook.com
CraZyDroiD,

51

Ho cercato su Google questo problema per un po ', poi mi è venuto in mente che esiste un metodo Android, android.text.util.Linkify, che utilizza alcune regex piuttosto robuste per raggiungere questo obiettivo. Fortunatamente, Android è open source.

Usano alcuni modelli diversi per abbinare diversi tipi di URL. Puoi trovarli tutti qui: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/text/util/Regex.java#Regex. 0WEB_URL_PATTERN

Se sei solo preoccupato per gli URL che corrispondono a WEB_URL_PATTERN, ovvero URL conformi alle specifiche RFC 1738, puoi utilizzare questo:

/((?:(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;

Ecco il testo completo della fonte:

"((?:(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|$)";

Se vuoi essere davvero fantasioso, puoi anche verificare gli indirizzi e-mail. La regex per gli indirizzi e-mail è:

/[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

PS: I domini di primo livello supportati da regex sopra sono aggiornati a giugno 2007. Per un elenco aggiornato devi controllare https://data.iana.org/TLD/tlds-alpha-by-domain.txt .


3
Poiché hai un'espressione regolare senza distinzione tra maiuscole e minuscole, non devi specificare a-zA-Ze http|https|Http|Https|rtsp|Rtsp.
Ry-

4
Questo è carino, ma non sono sicuro che lo userei mai. Per la maggior parte dei casi d'uso preferirei accettare alcuni falsi positivi piuttosto che utilizzare un approccio che si basa su un elenco di TLD codificato. Se elenchi i TLD nel tuo codice, un giorno ti garantirai che sarà obsoleto e preferirei non aggiungere manutenzione futura obbligatoria al mio codice se posso evitarlo.
Mark Amery,

3
Funziona il 101% delle volte, sfortunatamente trova anche URL che non sono preceduti da uno spazio. Se eseguo una partita su hello@mydomain.com, viene visualizzato "mydomain.com". C'è un modo per migliorare questo per prenderlo solo se ha uno spazio prima di esso?
Deminetix

Inoltre, questo è perfetto per catturare gli URL inseriti dall'utente
Deminetix

Nota che grepcode.com non è più attivo, ecco quello che penso sia un collegamento al posto giusto nel codice sorgente di Android. Penso che il regex che Android sta usando potrebbe essere aggiornato dal 2013 (post originale), ma non sembra essere stato aggiornato dal 2015 e quindi potrebbero mancare alcuni TLD più recenti.
James,

19

Basato su Crescent Fresh risposta di

se si desidera rilevare collegamenti con http: // O senza http: // e tramite www. puoi usare quanto segue

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>';
    }) 
}

Questa è una buona soluzione, ma voglio anche verificare che il testo non dovrebbe già contenere href. Ho provato questo regex = /((?!href)((https?:\/\/)|(www\.)|(mailto:))[^\s[+)/gi ma non funziona. Potete aiutarmi con questo o perché il regex sopra non funziona.
Sachin Jagtap,

Mi piace il fatto che tu abbia anche aggiunto target = "_ blank" all'output restituito. Questa versione è ciò che volevo. Niente di esagerato (altrimenti userei Linkifyjs) quanto basta per ottenere la maggior parte dei collegamenti.
Michael Kubler,

18

Questa libreria su NPM sembra abbastanza completa https://www.npmjs.com/package/linkifyjs

Linkify è un plug-in JavaScript piccolo ma completo per trovare URL in testo semplice e convertirli in collegamenti HTML. Funziona con tutti gli URL e gli indirizzi e-mail validi.


4
Ho appena finito di implementare linkifyjs nel mio progetto ed è fantastico. Linkifyjs dovrebbe essere la risposta a questa domanda. L'altro da guardare è github.com/twitter/twitter-text
Uber Schnoz,

6

La funzione può essere ulteriormente migliorata per il rendering delle immagini:

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/>'
        }
    }) 
} 

o per un'immagine di anteprima che si collega a un'immagine di dimensione ridotta:

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

Ed ecco la funzione strip () che pre-elabora la stringa di testo per uniformità rimuovendo qualsiasi html esistente.

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>")

Short Code Big Work! ...

Risultato:-

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

1

Esiste un pacchetto npm esistente: url-regex , basta installarlo con yarn add url-regexo npm install url-regexe usare come segue:

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 non è definito. Dovresti usare 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

prova questo:

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);
}

sarà anche riconoscere URL come google.com, http://www.google.bla, http://google.bla, www.google.blano, magoogle.bla


0

Puoi usare una regex come questa per estrarre i normali schemi di 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,})

Se hai bisogno di schemi più sofisticati, usa una libreria come questa.

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


Qual è lo scopo di (?:www\.|(?!www))? Perché dovrebbe wwwww.comessere non valido?
Toto

Hai ragione. In realtà l'ho appena preso poiché molti usano il regex. Consiglio di utilizzare la libreria collegata sopra. Dovremmo considerare molti casi nel rilevamento dell'URL, quindi la regex dovrebbe essere più complicata.
Kang Andrew,

0

Soluzione generica orientata agli oggetti

Per le persone come me che usano framework come angolari che non consentono la manipolazione diretta di DOM, ho creato una funzione che accetta una stringa e restituisce una matrice di url/ plainTextoggetti che può essere utilizzata per creare qualsiasi rappresentazione dell'interfaccia utente desiderata.

URL regex

Per la corrispondenza degli URL ho usato h0mayunregex (leggermente adattato) :/(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g

La mia funzione elimina anche i caratteri di punteggiatura dalla fine di un URL simile .e ,che credo più spesso sarà la punteggiatura effettiva di una fine URL legittima (ma potrebbe essere! Questa non è scienza rigorosa come altre spiegazioni spiegano bene) Per questo applico il seguente regex su URL corrispondenti /^(.+?)([.,?!'"]*)$/.

Codice dattiloscritto

    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

Se si desidera rilevare collegamenti con http: // OR senza http: // OR ftp o altri possibili casi come la rimozione di punteggiatura finale alla fine, dare un'occhiata a questo codice.

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

Un modo semplice di usare è usare NPM

npm install --save url-knife
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.