变量数组+正则表达式不能一起工作

variable array + regular expression not working together?

本文关键字:一起 工作 不能 正则表达式 数组 变量      更新时间:2023-09-26

im正在制作一个小的smiley脚本,它所做的是将: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)。它一直在生产这种<img src="undefined">

我的HTML示例如下:

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

我的问题在哪里?

我想你需要一个函数:

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

这时html()的函数形式就派上了的用场

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

在JavaScript中,属性名称不像PHP中那样有前缀。您在smileys对象中创建的特性的名称是1,而不是$1,因此请将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中的"关联数组"一词。smileys对象只是一个对象,而不是数组。在JavaScript中,当我们说"数组"时,我们指的是通过[]new Array创建的东西,它对某类属性名称(数字名称)、特殊的length属性和一些方便的类似数组的函数有特定的处理。您对smileys所做的一切都很好,完全正常,我们只是倾向于不使用"数组"这个词("map"在JS世界中更常见)。