2014-01-29 5 views
7

Ich habe ein paar andere mögliche Lösungen auf SO geschaut, aber sah nicht, die tun, was ich tat.Javascript/jQuery - Parsen Hashtags in einer Zeichenfolge mit Regex, mit Ausnahme von Ankern in URLs

Zur Zeit konnte ich eine Zeichenfolge analysieren und Hash-Tags mit dem folgenden Code ermitteln:

mystring = mystring.replace(/(^|\W)(#[a-z\d][\w-]*)/ig, "$1<span class='hash_tag'>$2</span>").replace(/\s*$/, ""); 

Und das erkennt erfolgreich alle Arten von #Hashtags. Es erkennt jedoch auch Anker in URLs, wie zum Beispiel: http://www.example.com/#anchor - Ich kann nicht herausfinden, wie ich das ändern kann, was ich Anker ausschließen muss, während ich es flexibel halte.

Dank

+1

Nun, Sie gehen tief in etwas Fieses. HTML-Analyse! BTW, wo befinden sich die Hashtags in URLs? sind sie in ? oder könnte irgendwo sein? – MJoraid

+0

# hola # ja # lieben langen .. Upps, ich vergaß Raum hinzufügen, bevor die # – MJoraid

Antwort

17

Hier ist ein regex Hashtag (#) zu entsprechen, wenn sie einen Raum, bevor es hat oder es ist die Zeichenkette beginnen .. wie so:

(^|\s)(#[a-z\d-]+) 

Arbeiten regex Beispiel:

http://regex101.com/r/pJ4wC5

Javascript:

var string = '#hello This is an #example of some text with #hash-tags - http://www.example.com/#anchor but dont want the link'; 

string = string.replace(/(^|\s)(#[a-z\d-]+)/ig, "$1<span class='hash_tag'>$2</span>"); 

console.log(string); 

Ausgang:

<span class='hash_tag'>#hello</span> This is an <span class='hash_tag'>#example</span> of some text with <span class='hash_tag'>#hash-tags</span> - http://www.example.com/#anchor but dont want the link 
+0

Dank @MElliott mit - ich modifiziert es (^ | \ n) (# [az \ d] [\ w -] *) und das scheint perfekt zu sein. Erlauben von _ - etc als Teil des Hashtags. – Martin

+0

BTW, danke, dass du mir regex101 gezeigt hast - großartige Seite, um die Regex zu testen. Auch eine kleine Änderung an dir erlaubt das _ als Teil des Tags auch: (^ | \ s) (# [a-z \ d -_] +) – Martin

+0

@Martin, Super! Froh, dass ich helfen konnte. Vielen Dank. Ja, regex101 ist mein Favorit geworden. :) – MElliott

0

Die Idee ist, zu versuchen, den „einen“ Tag zuerst zu passen und nach dem Hashtag Unter-Pattern versucht, die in einer Erfassungsgruppe ist. Eine Rückruffunktion testet die Erfassungsgruppe und gibt den „einen“ Tag oder der Modifikator Hashtag String:

var str = '<a href="sdfsdfd#ank"> qsdqd</a> #toto (#titi) ^#t-_-Ata'; 

var result = str.replace(/<a\b[^>]*>|\B(#[^\W_][\w-]*)/gi, 
         function (m, p) { 
          return (p) ? '<span class="hash_tag">'+m+'</span>' : m; 
         }); 

console.log(result); 
+0

@Casimer - danke, aber die URL würde in einer Zeichenfolge erwähnt werden, wie http: // Beispiel.com/# Anker und nicht innerhalb eines Tags. Ich denke, das Beste wäre, dass der #hashtag ein Leerzeichen/Newline-Zeichen (oder der Beginn der Zeichenkette) sein muss - alles andere und es wird nicht als Hash-Tag betrachtet. – Martin

1

Ich weiß, das beantwortet wurde, aber wenn Sie Styling benötigen, ist hier eine Lösung, die ich an einem Projekt verwendet:

<div id='result'>The quick brown #fox jumps over the #second lazy dog</div> 
<div id='result2'> </div> 

//jquery 
var str = $('#result').html(); 
var edt = str.replace(/(^|\s)(#[a-z\d-]+)/ig, "$1<span class='hash_tag'>$2</span>"); 

$('#result2').html(edt); 




//CSS 
.hash_tag {color:red;} 
#result {display:none;} 
Verwandte Themen