2017-12-30 12 views
0

ich diese Regex bin mit URLs in einer Textzeichenfolge erkennen:Regex URL-Erkennung Javascript

/(http(s)?:\/\/.)?(www\.)?[[email protected]:%._\+~#=]{2,256}(\.[a-z]{2,6}|:[0-9]{3,4})\b([[email protected]:%_\+.~#?&\/\/=]*)/gi 

mit dieser Funktion kombiniert, um den erfassten Strings mit Links zu ersetzen:

function linkify(text) { 
    return text.replace(urlRegex, function(url) { 
     return "<a href=" + url + ">" + url + "</a>"; 
    }); 
} 

Sowohl hier: Detect URLs in text with JavaScript

Dies ist für die Mehrheit der Links arbeiten, jedoch verbindet wie www.fatsoma.com/flatline-cardiff und tickets.partyforthepeople.org/events/3633 erkannt werden , aber Link zum Nirgendwo, Hinzufügen des lokalen Pfades vor dem erkannten Link, z. B. http://127.0.0.1:8000/filelocation/tickets.partyforthepeople.org/events/3633

Ist dies mit dem Fehlen eines Protokolls wie Https zu Beginn der Verbindung zu tun?

+0

Browser getan hat endlose Schäden, die durch die Entscheidung des Protokoll-Präfix in der Adressleiste .. eine gültige absolute URL zu verbergen hat mit 'http beginnen:// ',' https: // 'oder ähnlich. –

+0

Die Regex sieht wirklich funky, ich bin mir ziemlich sicher, dass es sowohl falsche positive als auch falsche negative liefert. Basierend auf dem Kontext kann auch eine Decodierung stattfinden, um eine tatsächliche URL zu erhalten. Und die Handhabung der relativen URL-Zusammensetzung. Und Ihrem Ersatz fehlen sowohl Zitate als auch Flucht. – jcaron

+0

Mir ist aufgefallen, dass Ihre Funktion den href-Wert nicht angibt. Besser ist: 'return ${url}' (den Text in Backticks, ich kann sie nicht in einem Kommentar verwenden) – RMo

Antwort

0

Ist dies mit dem Fehlen eines Protokolls wie Https zu Beginn der Verbindung zu tun?

Ja.

Versuche ein Protokoll, wenn nicht hinzuzufügen:

function linkify(text) { 
    return text.replace(urlRegex, function(url) { 
     if (url.indexOf('http://') === 0 || url.indexOf('https://') === 0) { 
      return "<a href='" + url + "'>" + url + "</a>"; 
     } 
     return "<a href='//"+url+"'>"+url+"</a>"; 
    }); 
} 
+0

Dies behebt das Problem mit diesen Links, danke! Die Regex wirft jedoch falsche Positive, also muss ich daran arbeiten. –