2009-05-11 1 views
0

Мне нужно регулярное выражение, чтобы вырезать любой BBCode в строке. У меня есть следующий (и массив с тегами):Regex to strip BBCode

new RegExp('\\[' + tags[index] + '](.*?)\\[/' + tags[index] + ']'); 

Он поднимает [тег] это [/ теги] только штрафом, но терпит неудачу при использовании [URL = http://google.com]this[/url].

Что мне нужно изменить? Большое спасибо.

+0

Так же вы хотите удалить какой-либо тег вы дали в 'tags' массива. – Gumbo

ответ

1

Вы должны разрешить любой символ, отличный от ']' после тега, пока не найдете ']'.

new RegExp('\\[' + tags[index] + '[^]]*](.*?)\\[/' + tags[index] + ']'); 

Вы можете упростить это до следующего выражения.

\[[^]]*]([^[]*)\[\\[^]]*] 

Проблема с этим в том, что он будет соответствовать [WrongTag]stuff[\WrongTag] тоже. Для сопоставления вложенных тегов требуется несколько раз использовать выражение.

+0

Почему вы вообще заинтересованы в размещении тегов, когда ваша цель состоит в том, чтобы вытащить любые метки BBcode? – Tomalak

+0

[^]] нуждается в ускорении до [^ \\\]] –

0

Я думаю

new RegExp('\\[' + tags[index] + '(=[^\\]]+)?](.*?)\\[/' + tags[index] + ']'); 

должны это сделать. Вместо группы 1 вы должны выбрать группу 2.

+0

[^ \\\]] не соответствует символам, отличным от ']', но символы, отличные от '\', за которыми следует ']', потому что вы не должны убегать ' ] 'в первой позиции. Правильно [^]]. –

1

Чтобы вырезать любой BBCode, использовать что-то вроде:

string alltags = tags.Join("|"); 
RegExp stripbb = new RegExp('\\[/?(' + alltags + ')[^]]*\\]'); 

Заменить глобально с пустой строкой. Никакой дополнительной петли не требуется.

+0

[^ \\\]] не соответствует символам, отличным от ']', но символы, отличные от '\', за которыми следует ']', потому что вы не должны упускать ']' в первой позиции. Правильно [^]]. –

+0

В классе персонажа нет «следуют». Во всяком случае, класс символов соответствует всем, кроме «\» и «]». Я выдержу излишнюю обратную косую черту. – Tomalak

1

Вы можете проверить сбалансированные тегов с помощью обратной ссылки:

new RegExp('\\[(' + tags.Join('|') + ')[^]]*](.*?)\\[/\\1]'); 

Реальная проблема заключается в том, что вы cant't сопрягать произвольные вложенные теги в регулярном выражении (это предел обычного языка). Некоторые языки допускают рекурсивные регулярные выражения, но это расширения (которые технически делают их нерегулярными, но не изменяют имя, которое большинство людей используют для объектов).

Если вы не заботитесь о сбалансированных тегах, вы можете просто вырезать любой тег вы найдете:

new RegExp('\\[/?(?:' + tags.Join('|') + ')[^]]*]'); 
+0

Балансировочные метки здесь абсолютно не актуальны. OP хочет, чтобы теги удалялись, а не совпадали. – Tomalak

1

Я наткнулся на эту тему и нашел, что это полезно, чтобы получить меня на правильном пути, но вот конечные один я провел два час здания (это мой первый RegEx!) для JavaScript и протестировано для работы очень хорошо для сумасшедших гнезд и даже неправильно вложенных строк, он просто работает !:

string = string.replace(/\[\/?(?:b|i|u|url|quote|code|img|color|size)*?.*?\]/img, ''); 

Если строка = «[б ] [color = blue] [url = www.google.com] Google [/ url] [/ color] [/ b] ", тогда новая строка будет" Goo гле». Удивительно.

Надежда кто-то считает, что полезно, это был топ матч для «JavaScript RegEx полосы BBCode» в Google;)

+0

спасибо - это единственное решение на странице, которая работала для меня. – Neuralrank

0

Помните, что многие (большинство) регулярных выражений ароматизаторов по умолчанию не позволяйте мета символов соответствия линии DOT? терминаторы. Вызов такого тега, как

"[foo]dsdfs 
fdsfsd[/foo]" 

не работает. Включите DOTALL, добавив «(?s)»в своем регулярном выражении, или заменить мета-символ DOT в своем регулярном выражении по классу символов [\ S \ s]

1

У меня была аналогичная проблема -. в PHP не Javascript - я должен был раздеть BBCode . [цитата] теги, а также цитаты в пределах тегов Добавлена ​​проблема в том, что часто произвольный дополнительный материал внутри [quote] тег, например [quote:7e3af94210="username"]

Это работает для меня:

$post = preg_replace('/[\r\n]+/', "\n", $post); 
$post = preg_replace('/\[\s*quote.*\][^[]*\[\s*\/quote.*\]/im', '', $post); 
$post = trim($post); 

линий 1 и 3 - только для того, чтобы убрать любые дополнительные строки новой строки и любые, оставшиеся в результате регулярного выражения.

0

Это работало для меня, для каждого имени тега. он также поддерживает строки как '[URL = „блаблабла“] [/ URL]

str = str.replace(/\[([a-z]+)(\=[\w\d\.\,\\\/\"\'\#\,\-]*)*(*[a-z0-9]+\=.+)*\](.*?)\[\/\1\]/gi, "$4")