Regex, чтобы лишить BBCode - PullRequest
1 голос
/ 11 мая 2009

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

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

Он просто подхватывает [tag] этот [/ tag], но не работает при использовании [url = http://google.com]this[/url].

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

Ответы [ 8 ]

2 голосов
/ 27 сентября 2009

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

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

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

Надеюсь, кто-то найдет это полезным, это было лучшее совпадение с 'JavaScript RegEx strip BBCode' в Google;)

1 голос
/ 25 июля 2012

У меня была похожая проблема - в PHP, а не в Javascript - мне пришлось удалить теги BBCode [quote], а также кавычки внутри тегов. Добавленная проблема в том, что внутри тега [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 предназначены только для того, чтобы привести в порядок любые новые строки, а также те, которые остались в результате регулярного выражения.

1 голос
/ 11 мая 2009

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

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

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

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

 new RegExp('\\[/?(?:' + tags.Join('|') + ')[^]]*]');
1 голос
/ 11 мая 2009

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

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

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

1 голос
/ 11 мая 2009

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

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

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

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

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

0 голосов
/ 04 марта 2013

это работает для меня, для каждого имени тега. он также поддерживает строки типа '[url = "blablabla"] [/ url]'

str = str.replace(/\[([a-z]+)(\=[\w\d\.\,\\\/\"\'\#\,\-]*)*( *[a-z0-9]+\=.+)*\](.*?)\[\/\1\]/gi, "$4")
0 голосов
/ 27 сентября 2009

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

"[foo]dsdfs
fdsfsd[/foo]"

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

0 голосов
/ 11 мая 2009

Я думаю

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

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

...