JavaScript ile metindeki URL'leri algılama


151

Herkes bir dizi dizede URL tespit etmek için önerileri var mı?

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

Güncelleme: Bu normal ifadeyi bağlantı tespiti için kullandım… Görünüşe göre birkaç yıl sonra.

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

Tam yardımcı (isteğe bağlı Gidon desteği ile) # 1654670 özünde .


11
Muhtemelen yenilerini oluşturmaya devam ettikleri için sınırlı sayıda TLD listelemeye çalışmak iyi bir fikir değildir.
Maxy-B

Katılıyorum. Bazen TLD'lerle güncellenebilen kod gerekir. Aslında regex veya dinamik kod güncelleme TLD koduna TLD eklemek için komut dosyası oluşturmak olabilir. Hayatta TLD'ler ve Timezone gibi standartlaşmak için gereken şeyler var. Sonlu kontrol, gerçek dünya adresi kullanım durumu için mevcut "TLD" doğrulanabilir URL'yi doğrulamak için iyi olabilir.
Edward Chan JW

Yanıtlar:


217

İlk olarak, URL'lerle eşleşen iyi bir regex'e ihtiyacınız var. Bunu yapmak zor. Bkz burada , burada ve burada :

... neredeyse her şey geçerli bir URL'dir. Bölmek için bazı noktalama kuralları vardır. Herhangi bir noktalama işareti yoksa, hala geçerli bir URL'niz var.

RFC'yi dikkatlice kontrol edin ve "geçersiz" bir URL yapıp yapamayacağınıza bakın. Kurallar çok esnektir.

Örneğin :::::, geçerli bir URL. Yol ":::::". Oldukça aptal bir dosya adı, ancak geçerli bir dosya adı.

Ayrıca, /////geçerli bir URL'dir. Netloc ("hostname") 'dir "". Yol "///". Yine aptalca. Ayrıca geçerlidir. Bu URL "///" , eşdeğer olanı normalleştirir .

Gibi bir "bad://///worse/////" şey mükemmel bir şekilde geçerlidir. Aptal ama geçerli.

Her neyse, bu cevap size en iyi regex'i vermek değil, metnin içine JavaScript ile dize kaydırmanın nasıl yapıldığının bir kanıtıdır.

Tamam, bunu kullanalım: /(https?:\/\/[^\s]+)/g

Yine, bu kötü bir normal ifade . Birçok yanlış pozitif olacaktır. Ancak bu örnek için yeterince iyi.

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

Özetle şunu deneyin:

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

4
"Birçok yanlış pozitif" in bazı örnekleri bu cevabı büyük ölçüde geliştirecektir. Aksi takdirde, gelecekteki Google çalışanları bazı (belki geçerli?) FUD'lara bırakılır.
cmcculloh

Asla ikinci parametre olarak işlevini geçebileceğini bilmiyordum .replace: |
Aamir Afridi

4
İyi, ama text="Find me at http://www.example.com, and also at http://stackoverflow.com."iki nokta 404 noktalama noktalama sonuçları ile "yanlış" bir şey yapar . Bazı kullanıcılar bunun farkındadır ve kırılmayı önlemek için noktalama işaretlerinden önce URL'lerden sonra bir boşluk ekler, ancak kullandığım çoğu tarayıcı (Gmail, etherpad, phabricator) son noktalama işaretlerini URL'den ayırır.
skierpage

Metin zaten bağlantılı URL içeriyorsa removeAnchors (text) {var div = $ ('<div> </div>') .html (text) fonksiyonunu kullanabilirsiniz. div.find ( 'A') içeriği () sarılı ()..; dönüş div.text (); } önce text.replace önce çapa kaldırmak için
Muneeb Mirza

Metin zaten bağlantılı URL içeriyorsa, bağlantıyı kaldırmak için jquery kullanıyorsunuz, ancak Angular kullanıyorum. Angular'daki çapayı nasıl kaldırabilirim?
Sachin Jagtap

132

İşte benim regex olarak kullanarak sona erdi:

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

Bu, URL'de son noktalama işareti içermez. Hilal işlevi bir cazibe gibi çalışır :) yani:

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
Sonunda en belirgin durumda gerçekten işe yarar bir regex! Bu bir yer imini hak ediyor. Bunu bulana kadar googles aramasından binlerce örneği test ettim.
Ismael

6
Basit ve güzel! Ancak bunun dışında pahalı olması derleme urlRegexolarak tanımlanmalıdır . linkify
BM

1
Bu, tam URL'yi algılayamaz: disney.wikia.com/wiki/Pua_(Moana)
Jry9972

1
()Her karakter listesine ekledim ve şimdi çalışıyor.
Guillaume

3
sadece www ile başlayan bir URL tespit edemez. örneğin: www.facebook.com
CraZyDroiD

51

Bu problemi bir süre googledim, o zaman bana bunu gerçekleştirmek için bazı oldukça sağlam regexes kullanan bir Android yöntemi, android.text.util.Linkify var. Neyse ki, Android açık kaynak.

Farklı türdeki URL'leri eşleştirmek için birkaç farklı desen kullanırlar. Hepsini burada bulabilirsiniz: 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

Yalnızca WEB_URL_PATTERN ile eşleşen URL'lerden, yani RFC 1738 spesifikasyonuna uyan URL'lerden endişe ediyorsanız, bunu kullanabilirsiniz:

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

İşte kaynağın tam metni:

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

Gerçekten süslü olmak istiyorsanız, e-posta adreslerini de test edebilirsiniz. E-posta adresleri için normal ifade:

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

Not: Yukarıdaki normal ifade ile desteklenen en üst düzey alan adları Haziran 2007 itibariyle geçerlidir. Güncel bir liste için https://data.iana.org/TLD/tlds-alpha-by-domain.txt adresini kontrol etmeniz gerekir. .


3
Büyük / küçük harfe duyarlı olmayan bir normal ifadeniz olduğundan a-zA-Zve ve belirtmeniz gerekmez http|https|Http|Https|rtsp|Rtsp.
Ry-

4
Bu güzel, ama hiç kullanacağımdan emin değilim. Çoğu kullanım durumunda, sabit kodlanmış bir TLD listesine dayanan bir yaklaşım kullanmak yerine bazı yanlış pozitifleri kabul etmeyi tercih ederim. Kodunuzda TLD'leri listelerseniz, bir gün eski olacağını garanti edersiniz ve bundan kaçınabiliyorsam kodumda gelecekteki zorunlu bakımları yapmamayı tercih ederim.
Mark Amery

3
Bu zamanın% 101'inde işe yarıyor, maalesef boşluktan önce gelen URL'leri de buluyor. Hello@alanadim.com'da bir maç çalıştırırsam 'alanadim.com' u yakalar. Bunu, yalnızca önünde bir boşluk varsa yakalamak için geliştirmenin bir yolu var mı?
Deminetix

Ayrıca, bu, kullanıcının girdiği url'leri yakalamak için mükemmeldir
Deminetix

Grepcode.com, artık yukarı olduğunu Not burada ben ne düşünüyorum Android kaynak kodunda doğru yere bir bağlantıdır. Android'in kullandığı regex'in 2013'ten beri güncellenmiş olabileceğini düşünüyorum (orijinal yayın), ancak 2015'ten beri güncellenmiş gibi görünmüyor ve bu nedenle bazı yeni TLD'ler eksik olabilir.
James

19

Dayanarak Hilal Taze cevap

http: // VEYA http: // ve www ile olmayan bağlantıları tespit etmek istiyorsanız . aşağıdakileri kullanabilirsiniz

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

Bu iyi bir çözüm, ancak metnin içinde href bulunmaması gerektiğini de kontrol etmek istiyorum. Bu normal ifadeyi denedim = /((?!href)((https?:\/\/)|(www\.)|(mailto:))[^\s Viagra+)/gi ama çalışmıyor. Bana bu konuda yardımcı olabilir misiniz veya yukarıdaki normal ifade neden çalışmıyor?
Sachin Jagtap

Ben de döndürülen çıktı hedef = "_ blank" eklediğiniz gibi. Bu sürüm istediğim şey. Hiçbir şey üst üzerinde (aksi takdirde Linkifyjs kullanmak istiyorsunuz) sadece çoğu bağlantı almak için yeterli.
Michael Kubler

18

NPM'deki bu kütüphane oldukça kapsamlı görünüyor https://www.npmjs.com/package/linkifyjs

Linkify, URL'leri düz metin olarak bulmak ve HTML bağlantılarına dönüştürmek için küçük ama kapsamlı bir JavaScript eklentisidir. Geçerli tüm URL'lerle ve e-posta adresleriyle çalışır.


4
Ben sadece projemde linkifyjs uygulamayı bitirdim ve bu harika. Linkifyjs bu sorunun cevabı olmalı. Bakmak üzere başka biri github.com/twitter/twitter-text
Uber schnoz

6

İşlev, görüntüleri oluşturmak için daha da geliştirilebilir:

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

veya tam boyutlu resme bağlantı veren bir küçük resim için:

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

Ve işte mevcut html'yi kaldırarak metin dizesini tekdüzelik için önceden işleyen strip () işlevi.

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

Kısa Kod Büyük İş! ...

Sonuç:-

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

1

Mevcut npm paketi var: url-regex , sadece yarn add url-regexveya ile kurun npm install url-regexve aşağıdaki gibi kullanın:

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 tanımsız. Tmp.innerHTML kullanmalısınız

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

bunu dene:

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

Ayrıca gibi URL'ler tanıyacak google.com, http://www.google.bla, http://google.bla, www.google.blaancakgoogle.bla


0

Normal url kalıplarını çıkarmak için böyle bir normal ifade kullanabilirsiniz.

(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,})

Daha karmaşık kalıplara ihtiyacınız varsa, bunun gibi bir kütüphane kullanın.

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


Amacı nedir (?:www\.|(?!www))? Neden wwwww.comgeçersiz olmalı ?
Toto

Haklısın. Aslında ben regex kullanmak kadar aldım. Yukarıdaki bağlantılı kütüphaneyi kullanmanızı tavsiye ederim. URL tespitinde birçok vakayı düşünmeliyiz, bu nedenle normal ifade daha karmaşık olmalıdır.
Kang Andrew

0

Genel Nesneye Dayalı Çözüm

Benim gibi DOM'u doğrudan manipüle etmeye izin vermeyen açısal gibi çerçeveler kullanan insanlar için, bir dize alan ve istediğiniz herhangi bir UI temsili oluşturmak için kullanılabilecek url/ plainTextnesneler dizisi döndüren bir işlev oluşturdum .

URL normal ifadesi

URL eşleşmesi için h0mayunregex kullandım (biraz uyarlanmış) :/(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g

Benim fonksiyonum da bir URL'nin sonundan noktalama karakterlerini bırakıyor .ve ,yasal bir URL sonundan daha fazla gerçek noktalama olduğuna inanıyorum (ama olabilir! Bu, diğer cevapların iyi açıkladığı gibi titiz bir bilim değildir). eşleşen URL'ler üzerinden normal ifadeyi izleyerek /^(.+?)([.,?!'"]*)$/.

Yazı kodu

    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: // VEYA http: // VEYA ftp olmadan bağlantıları tespit etmek istiyorsanız VEYA sonunda noktalama işaretlerini kaldırmak gibi diğer olası durumlar için bu koda bir göz atın.

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

Bunu kullanmanın basit bir yolu NPM kullanmaktır

npm install --save url-knife
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.