jquery match()变量插值 - 复数正则表达式

时间:2009-12-24 01:03:33

标签: javascript jquery regex interpolation match

我已经查看了this,这对某一点很有帮助。

这是问题所在。我有一个通过用户点击传播到元素的用户列表;像这样的东西:

<div id="box">
    joe-user
    page-joe-user
    someone-else
    page-someone-else
</div>

点击后,我想确保用户尚未点击进入div。所以,我正在做类似的事情:

if ( ! $('#box').html().match(rcpt) )
{
   update_div();
}
else
{
   alert(rcpt+' already exists.');
}

然而,由于现有的javascript对正则表达式缺乏插值,导致我的警报在选择page-joe-user的用例中触发,然后用户选择joe-user,这显然是不完全一样。

在Perl中,我会做类似的事情:

if ( $rcpt =~ /^\Qrcpt\E/ )
{
    # code
}

我想做的就是将我的match()更改为:

if ( ! $('#box').html().match(/^rcpt/) )
{
    # code
}

if ( ! $('#box').html().match(rcpt) )似乎有点有希望,但它也失败了。在函数IE new RegExp()中使用复杂RE语法的连接也无法使用$('#box').html().match(new RegExp('^'+rcpt))。我也试过了$('#box').html().match('/^'+rcpt'/')。我只能想象我错过了什么。我对javascript很新。

我似乎无法在此网站上找到真正解决此类用例的任何内容。

TIA

1 个答案:

答案 0 :(得分:2)

match函数仅适用于字符串,而不适用于jQuery对象。

执行此操作的最佳方法是将每个用户名放入单独的HTML标记中。

例如:

<ul id="users">
    <li>joe-user</li>
    <li>page-joe-user</li>
    <li>someone-else</li>
    <li>page-someone-else</li>
</ul>

然后您可以写下以下内容:

if($('#users li').is(function () { return $(this).text() === rcpt; }))

如果你想按自己的方式去做,你应该调用text()来获取元素中的字符串。 ($('#box').text().match(...)


编辑:使用HTML执行此操作的最佳方法是拆分字符串。

例如:

var userExists = false;
var users = $('#box').text().split(/\r?\n/);

for(var i = 0; i < users.length; i++) {   //IE doesn't have indexOf
    if (users[i] == rcpt) {
        userExists = true;
        break;
    }
}
if (userExists) {
    //Do something
}

这样做的另一个好处是不易受正则注射的影响。