2012-03-26 9 views
0

小さなスマイリースクリプトを作っているのですが、それは:: 1 ::をdivの画像htmlに変更することです。以下のよう可変配列+正規表現は一緒に機能しませんか?

コード:

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機能は、ユーザイベントによってトリガされます。

ただし、文章の数字(ID)は取得できません。

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

どこに私の問題はここにある: それは次のようにこの<img src="undefined">

私のHTMLの例を生産する上で保持しましたか?

答えて

2

私はあなたがここに関数が必要推測:

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

html()の関数形式はありません、$ 1は正規表現からある便利

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

はいこれは答えですthanksss – sm21guy

+0

+1素晴らしいソリューション、私のための新しい知識:D –

0

JavaScriptでは、プロパティ名にはPHPでよくあるような接頭辞がありません。 smileysオブジェクトで作成するプロパティの名前は、ではなく、ではなく、smileys['$1']からsmileys['1']に変更してください。

更新:下記のコメントから、$1をキャプチャグループに使用しようとしているようです。それは$1が渡された文字列の一部ですが、式start + smileys['$1'] + endが評価された場合、の前にと評価され、replaceが呼び出されて渡されます。 smileys['$1']は未定義です。

あなたが検索を実行しようとしているので、あなたの最善の策は、ルックアップを行う機能に渡すことです:

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

c1は、最初のキャプチャグループのテキストです。あなたはPHPからの用語「連想配列」に慣れているので、あなたは、私は推測している配列、それを呼んでいるMore


です。 smileysオブジェクトは単なるオブジェクトであり、配列ではありません。 JavaScriptでは、「配列」とは、特定のクラスのプロパティ名(数字のもの)、特殊なlengthのプロパティ、および便利な配列のような機能を持つまたはnew Arrayによって作成されたものを意味します。 smileysで行ったことは完全に正常であり、完全に正常です。単に「配列」という言葉を使用しない傾向があります(「地図」はJS世界でより一般的です)。

+0

に来るときここにあります。 :: 1 :: – sm21guy

+0

@ sm21guyから1を得る:いいえ、そうではありません。正規表現で使用するには、 'replace'に渡す文字列の一部でなければなりません。しかし、そうではありません。それは、 'replace'が呼び出される前に評価され、その中に渡されます。あなたのコードの '$ 1'はあなたが'スマイリー 'で探しているプロパティの名前です。上のコードでは、 'smileys ['$ 1']'は 'undefined'になります。 'replace'とは何も関係ありません。 –

+0

@ sm21guy:あなたがやろうとしていることをするための答えを更新しました。 –

関連する問題