2009-12-24 30 views
3

我已经看过this,这对一点很有帮助。jquery match()可变插值 - 复杂正则表达式

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

<div id="box"> 
    joe-user 
    page-joe-user 
    someone-else 
    page-someone-else 
</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 
} 

所有我想要做的就是改变我的比赛()是:

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

if (! $('#box').html().match(rcpt))似乎有点前途的,但它也失败。使用new RegExp()也不能在函数IE $('#box').html().match(new RegExp('^'+rcpt))中使用复杂RE语法的串联工作。我也试过$('#box').html().match('/^'+rcpt'/')。我只能想象我错过了什么。我很新的JavaScript。

我似乎无法找到任何真正解决这种用例的东西,在这个网站上。

TIA

回答

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 
} 

这具有不容易受到正则表达式喷射的附加益处。

+0

'rcpt'实际上并不是我代码中的一个对象。这只是一个变量。不过,我正在考虑将您的回应作为解决此问题的一种方法。 – Jim 2009-12-24 02:24:18

+0

如果'rcpt'是一个变量,只需删除引号。请注意,这是区分大小写的。如果你不想要,请调用'toUpperCase'。 – SLaks 2009-12-24 02:35:21

+0

恩,看,那正是我所做的。然而,问题在于match()将'joe-user'和'page-joe-user'混淆。所以,要复制的问题... 使用'页面乔user'和'乔 - user'例如:。 '$( '#元素')HTML()的比赛(RCPT)'主要作品但是如果我先点击'page-joe-user',然后尝试点击'joe-user',然后匹配()会触发匹配,事实上并不是(或者不希望它们是)。如果我按相反的顺序点击它们,那么一切运作良好。所以,为了缓解,我想锚定我的正则表达式,因为这看起来像典型的正则表达式贪婪。 – Jim 2009-12-24 02:48:33