удаление BBcode из текстовой области с помощью Javascript

Я создаю небольшой javscript для форума phpBB3, который подсчитывает, сколько символов вы набрали. Но мне нужно удалить специальные символы (что мне удалось сделать) и один BBcode: цитата

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

это то, что мне удалось сделать до сих пор, но я застрял:

http://jsfiddle.net/emjkc/

var text = '';
var char = 0;


  text = $('textarea').val();
  text = text.replace(/[&\/\\#,+()$~%.'":*?<>{}!?(\r\n|\n|\r)]/gm, '');
  char = text.length;
  $('div').text(char);
$('textarea').bind('input propertychange', function () {

    text = $(this).val();
    text = text.replace(/[&\/\\#,+()$~%.'":*?<>{}!?\-\–_;(\r\n|\n|\r)]/gm, '');

    char = text.length;
    $('div').text(char);
});

person NaGeL182    schedule 19.02.2013    source источник
comment
могут ли элементы [quote] быть вложенными?   -  person guido    schedule 19.02.2013
comment
да. это может быть nexted до трех раз.   -  person NaGeL182    schedule 19.02.2013
comment
вы хотите просто удалить тег bbcode или содержимое между [quote] и [/quote]?   -  person guido    schedule 19.02.2013
comment
содержание также. Я пытаюсь подсчитать, сколько пользователь напечатал сам, а не сколько он может процитировать.   -  person NaGeL182    schedule 19.02.2013
comment
Для этого лучше использовать парсер, а не регулярное выражение.   -  person guido    schedule 19.02.2013
comment
этот JS предназначен только для указания того, сколько пользователь вводит. Для версии PH для этого уже реализован мод.   -  person NaGeL182    schedule 19.02.2013


Ответы (2)


Вам лучше написать парсер для этого, однако, если вы хотите попробовать с регулярными выражениями, это должно делать трюк:

text = $('textarea').val();
while (text.match(/\[quote.*\[\/quote\]/i) != null) {
   //remove the least inside the innermost found quote tags 
   text = text.replace(/^(.*)\[quote.*?\[\/quote\](.*)$/gmi, '\$1\$2');
}
// now strip anything non-character
text = text.replace(/[^a-z0-9]/gmi, '');
person guido    schedule 19.02.2013
comment
это не разделило то, что внутри Цитаты. И что вы подразумеваете под написанием парсера? функция для этого? - person NaGeL182; 19.02.2013
comment
хорошо, ничего страшного. jsfiddle не работал, но после того, как я изменил порядок замены, он начал работать. порядок правильный в ответе спасибо! - Скрипт JS jsfiddle.net/TS26r - person NaGeL182; 19.02.2013
comment
ммх на самом деле он все еще работает со сбоями в случае несбалансированных тегов - person guido; 19.02.2013
comment
хорошо, я немного изменил регулярное выражение и обновил скрипку, и теперь это лучше - person guido; 19.02.2013
comment
+1, вы были правы, небольшой парсер звучит лучше, чем одно регулярное выражение, хе-хе. - person Salvatorelab; 19.02.2013

Я не уверен, что это сработает, но я думаю, что вы можете заменить все bbcode регулярным выражением следующим образом:

var withoutBBCodes = message.replace(/\[[^\]]*\]/g,"");

Он просто заменяет все вроде [any char != ']' goes here]

РЕДАКТИРОВАТЬ: извините, не заметил, что вы хотите заменить только [quote], а не все bbcodes:

var withoutBBQuote = message.replace(/\[[\/]*quote[^\]]*\]/g,"");

РЕДАКТИРОВАТЬ: хорошо, вы также хотите удалить цитируемый контент:

while (message.indexOf("[quote") != -1) {
    message = message.replace(/\[quote[^\]]*\]((?!\[[[\/]*quote).)*\[\/quote\]/g,"");
}

Я знаю, что вы уже получили решение благодаря @guido, но не хотели оставлять этот ответ неправильным.

person Salvatorelab    schedule 19.02.2013
comment
да, я вижу, он не считает символы между двумя кавычками. я поторопился. тем не менее спасибо за уведомление. - person NaGeL182; 19.02.2013
comment
заменил последнее регулярное выражение циклом while на регулярное выражение, которое удаляет вложенные кавычки до тех пор, пока не будет найдено больше кавычек. Время будет выполняться до 3 раз, если у вас есть до 3 уровней вложенных кавычек. - person Salvatorelab; 19.02.2013