Интерполяция переменной jquery match () - сложные регулярные выражения

Я уже просмотрел это, и это было в какой-то степени полезно.

Вот в чем проблема. У меня есть список пользователей, переданных в элемент с помощью щелчка пользователя; что-то вроде этого:

<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) ) казался немного многообещающим, но он тоже терпит неудачу. Использование new RegExp() также не работает при объединении сложного синтаксиса RE в функции IE $('#box').html().match(new RegExp('^'+rcpt)). Я также пробовал $('#box').html().match('/^'+rcpt'/'). Могу только представить, что я что-то упускаю. Я довольно новичок в javascript.

Кажется, я не могу найти ничего, что действительно касается такого варианта использования, здесь, на этом сайте.

ТИА


person Jim    schedule 24.12.2009    source источник


Ответы (1)


Функция 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(...))


EDIT: лучший способ сделать это с помощью вашего 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
}

Это имеет дополнительное преимущество, заключающееся в том, что он не уязвим для внедрения регулярных выражений.

person SLaks    schedule 24.12.2009
comment
rcpt на самом деле не является объектом в моем коде. Это просто переменная. Тем не менее, я рассматриваю ваш ответ как способ обойти это. - person Jim; 24.12.2009
comment
Если rcpt является переменной, просто удалите кавычки. Обратите внимание, что это чувствительно к регистру. Если вы этого не хотите, позвоните toUpperCase. - person SLaks; 24.12.2009
comment
Ну, видите, именно это я и сделал. Однако проблема в том, что match() путает joe-user с page-joe-user. Итак, чтобы воспроизвести проблему... Например, используя page-joe-user и joe-user: $('#element').html().match(rcpt) в основном работает, но если я сначала нажму на page-joe-user, а затем попытаюсь щелкнуть на joe-user, тогда match() вызовет совпадение, хотя на самом деле это не так (или не хочу, чтобы они были). Если я нажму их в обратном порядке, то все будет хорошо. Итак, чтобы смягчить ситуацию, я хочу привязать свое регулярное выражение, поскольку это выглядит как типичная жадность регулярных выражений. - person Jim; 24.12.2009
comment
И я хочу извиниться. Я вижу, что я перепутал ключевой момент, когда я сопоставляю () html. - person Jim; 24.12.2009
comment
Ну вот. Это лучшее решение, и я его реализовал. Работает хорошо. Спасибо. - person Jim; 24.12.2009