Лучший способ найти вложенные открывающие и закрывающие теги - PullRequest
3 голосов
/ 22 февраля 2012

Я создаю базовую доску обсуждений, используя ROR.Когда пользователь публикует ответ на сообщение, введенная текстовая область заполняется сообщением в кавычках с использованием тега: [QUOTE] .Таким образом, формат:

[QUOTE] здесь цитируется сообщение [/ QUOTE]

В настоящее время у меня есть простое решение, которое заменяет [QUOTE] и [/QUOTE] с HTML с использованием message.sub ('[QUOTE],' html here '') , пока [QUOTE] или [/ QUOTE] все еще существуют.Когда я отвечаю на цитируемое сообщение, я конвертирую HTML обратно в тег [QUOTE], чтобы убедиться, что в предварительно заполненной входной текстовой области нет HTML.Таким образом, цитата цитаты будет выглядеть так:

[QUOTE] [QUOTE] цитируемое здесь сообщение [/ QUOTE] [/ QUOTE]

Вотэта проблема.Если я снова запусту свой текущий метод, я получу дублированные поля HTML, такие как:

<div class='test'><div class='test'>quoted message goes here</div></div>

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

<div class='test1'><div class='test2'>quoted message goes here</div></div>

Ии так далее ... Есть предложения о том, как лучше всего это сделать?

Ответы [ 2 ]

5 голосов
/ 23 февраля 2012

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

text = "[QUOTE][QUOTE]quoted message here[/QUOTE][/QUOTE]"

quote_level = 0

new_text = text.gsub(/\[\/?QUOTE\]/) do |m|
  case (m)
  when '[QUOTE]'
    quote_level += 1
    "<div class='test#{quote_level}'>"
  when '[/QUOTE]'
    quote_level -= 1
    "</div>"
  end
end

puts new_text.inspect
# => "<div class='test1'><div class='test2'>quoted message here</div></div>"

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

1 голос
/ 23 февраля 2012

Вот идея:

Возьмите это регулярное выражение

(\[QUOTE\])(.*?)(\[\/QUOTE\])

и примените его к вашей строке.Он будет соответствовать открывающему тегу, закрывающему тегу и содержимому.Затем возьмите содержимое и снова примените регулярное выражение.Если есть совпадения, это будет ваш второй уровень вложенности.Повторите, пока есть совпадения.

Демо здесь: http://rubular.com/r/MkGsnUj3vL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...