2012-03-26 8 views
0

ich mache ein kleines Smiley-Skript, was es macht, ist :: 1 :: in ein Bild html für ein div zu ändern.Variablenarray + regulärer Ausdruck funktioniert nicht zusammen?

der Code wie folgt:

var smileys = { 
    '1': 'http://domain.com/smiley1.gif', 
    '2': 'http://domain.com/smiley2.gif', 
    '3': 'http://domain.com/smiley3.gif' 
}; 

function checksmileys(){ 
x$('.message').each(function() 
    var start = '<img src="'; 
    var end = '">'; 
    x$(this).html(x$(this).html().replace(/::(\d+)::/g, start + smileys['$1'] + end)); 
}); 

Checksmileys Funktion wird durch Benutzerereignis ausgelöst.

Es ist jedoch nicht in der Lage, die Ziffer (die die ID ist) aus einem Satz zu bekommen. Es hielt dieses Beispiel <img src="undefined">

Mein HTML auf die Produktion wie folgt:

<div id="chat"> 
    <ul> 
    <li class="message">Hi john</li> 
    <li class="message">what are you doing</li> 
    <li class="message">::1:: nothing</li> 
    <li class="message">hi</li> 
    <li class="message">nice to meet you ::1::</li> 
    </ul> 
</div> 

Wo ist mein Problem hier?

Antwort

2

Ich denke, Sie brauchen eine Funktion hier:

html = html.replace(/::(\d+)::/g, function($0, $1) { return start + smileys[$1] + end }) 

hier ist, wenn die funktionale Form von html() praktisch

kommt
$(this).html(function(_, oldhtml) { 
    return oldhtml.replace(/::(\d+)::/g, function($0, $1) { 
     return start + smileys[$1] + end; 
    }) 
}) 
+0

ja das ist die antwort danktss – sm21guy

+0

+1 großartige lösung, neues wissen für mich: D –

0

In JavaScript haben Eigenschaftsnamen keine Präfixe wie in PHP. Der Name der Eigenschaft, die Sie in Ihrem smileys Objekt erstellen, ist 1, nicht $1, also ändern Sie smileys['$1'] zu smileys['1'].

aktualisieren: Von Ihrem Kommentar unten, es scheint, Sie versuchen, $1 zu verwenden, um die Capture-Gruppe zu verweisen. Das funktioniert nur, wenn $1 Teil der Zeichenfolge ist, die Sie übergeben, aber der Ausdruck start + smileys['$1'] + end wird vor der Aufruf an replace ausgewertet und dann in es übergeben. smileys['$1'] wird nicht definiert.

Da Sie versuchen, einen Nachschlag zu tun, die beste Wahl ist in einer Funktion zu übergeben, das den Nachschlag tut:

x$(this).html(x$(this).html().replace(/::(\d+)::/g, function(m, c1) { 
    return start + smileys[c1] + end; 
})); 

c1 der Text der ersten Capture-Gruppe ist. More


Sie haben es ein Array genannt, was ich vermute, weil man auf den Begriff „assoziative Array“ von PHP gewohnt ist. Ihr smileys Objekt ist nur ein Objekt, kein Array. In JavaScript, wenn wir "Array" sagen, meinen wir etwas, das über [] oder new Array erzeugt wird, das eine spezifische Behandlung für eine bestimmte Klasse von Eigenschaftsnamen (numerische), eine spezielle length Eigenschaft und einige nützliche Array-ähnliche Funktionen hat. Was Sie mit smileys gemacht haben, ist völlig in Ordnung und völlig normal, wir neigen dazu, das Wort "Array" dafür nicht zu verwenden ("map" ist in der JS-Welt häufiger).

+0

nein, 1 $ aus dem regulären Ausdruck. es wird 1 aus :: 1 :: – sm21guy

+0

@ sm21guy: Nein, ist es nicht. Damit es im regulären Ausdruck verwendet werden kann, muss es Teil der Zeichenfolge sein, die Sie in 'replace' übergeben. Aber es ist nicht, der Ausdruck, der Teil von ist, wird ausgewertet, bevor 'ersetzen 'aufgerufen wird, und dann in es übergeben. '$ 1' in Ihrem Code ist der Name einer Eigenschaft, die Sie auf' smiley' suchen. Mit dem obigen Code wird 'smileys ['$ 1']' 'undefiniert'. Nichts hat mit Ersetzen zu tun. –

+0

@ sm21guy: Ich habe die Antwort aktualisiert, um Ihnen zu zeigen, wie Sie das tun können, was Sie tun möchten. –

Verwandte Themen