jquery match () переменная интерполяция - сложные регулярные выражения - PullRequest
3 голосов
/ 24 декабря 2009

Я уже посмотрел на это , что было очень полезно.

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

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

Все, что я хочу сделать, это изменить мой матч () на:

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.

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

ТИА

1 Ответ

2 голосов
/ 24 декабря 2009

Функция 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
}

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

...