2014-02-04 1 views
0

Я разбираю BBCode с помощью regex, чтобы заменить его на HTML. Я застрял прямо сейчас из-за разбора тегов [code].Пропустить парсинг BBCode внутри тега CODE

В основном, когда вы делаете [code][b]this is bb[/b] [u]code in[/u] [i]code[/i][/code] оно не должно заменить [b], [u], [i] и аналогичные метки, которые находятся внутри [code] тега.

К сожалению, с помощью preg_replace:

$this->_text = preg_replace('/\[i](.+?)\[\/i]/i', '<em>\1</em>', $this->_text); 
$this->_text = preg_replace('/\[code](.+?)\[\/code]]/i', '<code>\1</code>', $this->_text); 

приведет заменяющий их всех, и код внутри тега [code] станет HTML форматированию.

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

+0

Вы не можете анализировать HTML или BBCode с регулярными выражениями, потому что HTML и BBCode не являются примерами «обычного языка». Вам нужна соответствующая библиотека синтаксического анализа, которая предоставляет структуру документа вашей программе, где вы сможете работать с ней. – Dai

+0

@Dai Если бы это был HTML, я бы наверняка использовал 'DOM'. Для основ BBCode я хочу использовать регулярное выражение. Я не вижу смысла использовать любые библиотеки для разбора кода, потому что это слишком много (и регулярное выражение может достичь того, что я хочу), по крайней мере, в моем случае. – Lucas

+0

Ваш «обходной путь» не глупый, я не вижу другого способа сделать это, кроме полного парсера, как предположил @Dai - какой ИМХО является «правильным путем (TM)». – svoop

ответ

1

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

(?:\[code])(.*)(?=(?:\[\/code])) 

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

Даже код, который я только что написал, не удастся, если у вас есть два [/ code] [/ code].

+0

Yay, Спасибо за ваш ответ ! ;) – Lucas

+1

приветствуются – PatomaS