JavaScript: найти вложенный [цитата] - PullRequest
0 голосов
/ 26 ноября 2010

Я хочу выполнить проверку формы на стороне пользователя с помощью JavaScript (также используется jQuery).Цель состоит в том, чтобы удалить вложенные теги bbCode [quote] глубже, чем уровень 2. Скажем, у нас есть этот текст:

[quote=SoundMAX][quote=Laplundik][quote=SoundMAX]
blahblahblah[/quote]
blahblah
[/quote]
blah[/quote]

И получаем это:

[quote=SoundMAX][quote=Laplundik]
blahblah
[/quote]
blah[/quote]

Моя единственная идея состоит в.replace [quote] с помощью <div>, затем создайте объект DOM и удалите все, что глубже 2, с помощью jQuery, и проанализируйте все в обратном направлении в bbCode.Но это решение кажется слишком сложным, есть ли более элегантное?

РЕДАКТИРОВАТЬ:

Спасибо за хорошие решения.Основываясь на ответе Дарио, я сделал следующее:

var text=$('#edit-privatemsgbody').val();
var tmp=[];
var level=0;

for (var i=0,l=text.length;i<l;i++){
 if(text[i]=='['&&text[i+1]=='q') level++; 
 if(text[i-6]=='q'&&text[i-7]=='/'&&text[i-8]=='[') level--;
 if(level<3) tmp.push(text[i]);
}
alert(tmp.join(''));

Это прекрасно работает.

Но решение идеальной машины было похоже на вспышку.Я не знал о замене параметров функции обратного вызова раньше, теперь это удобно!Я с этим разберусь.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

На самом деле, вы можете использовать регулярные выражения, если вы рассматриваете его как ограниченный инструмент, который не может справиться с вложением.Строковый метод .replace может вызывать функцию для поиска замещающего текста для каждого соответствия, что позволяет нам отслеживать, насколько глубоко мы находимся в структуре разметки (код также размещен в http://jsfiddle.net/Zbgr3/3/):

var quoteLevel = 0;

alert(s.replace(/\[(\/?)quote[^\]]*\]|./gi, function(tag, slash) {
    // Opening tag?
    if(tag.length > 1 && !slash.length) quoteLevel += 1;
    // What to strip
    var strip = quoteLevel > 2;
    // Closing tag?
    if(tag.length > 1 && slash.length) quoteLevel -= 1;

    if(strip) return '';
    return tag;
}));

Если вы хотите допустить ошибки в разметке, вы можете добавить дополнительный код, который, например, предотвращает падение quoteLevel ниже нуля.

1 голос
/ 26 ноября 2010

Использовать обычный массив в качестве стека.Каждый раз, когда вы сталкиваетесь с [quote], увеличивайте свой массив на единицу, используя метод push().Когда вы встретите [/quote], уменьшите ваш массив на единицу, используя метод pop().

Если вы встретите [quote], а длина вашего массива равна 2, удалите это [quote] и удалите следующее [/quote] вы сталкиваетесь.

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

...