Regex, чтобы разделить BBCode на части - PullRequest
0 голосов
/ 24 сентября 2010

У меня есть это:

str = "some html code [img]......[/img] some html code [img]......[/img]"

и я хочу получить это:

["[img]......[/img]","[img]......[/img]"]

Ответы [ 4 ]

46 голосов
/ 25 сентября 2010

Пожалуйста, не используйте BBCode.Это зло .

BBCode ожил, когда разработчики были слишком ленивы, чтобы правильно разобрать HTML, и решили изобрести свой собственный язык разметки.Как и во всех ленивых продуктах, результат является полностью непоследовательным, нестандартным и широко принятым.

Попробуйте использовать более удобный для пользователя язык разметки, например Markdown (вот что такое StackПереполнение использует) или Текстиль .Оба имеют парсеры для Ruby:


Если вы все еще не хотите прислушиваться к моему совету и решили использовать BBCode, не изобретайте велосипед и не используйте BBCode parser .Чтобы ответить на ваш вопрос напрямую, есть наименее желательный вариант: используйте регулярное выражение.

/\[img\].*?\[\/img\]/

Как видно на rubular .Хотя я бы использовал /\[img\](.*?)\[\/img\]/, поэтому он будет извлекать содержимое внутри тегов img.Обратите внимание, что это довольно хрупкий файл и сломается, если есть вложенные теги img.Отсюда и совет использовать парсер.

7 голосов
/ 24 сентября 2010
irb(main):001:0> str = "some html code [img]......[/img] some html \
code [img]......[/img]"
"some html code [img]......[/img] some html code [img]......[/img]"
irb(main):002:0> str.scan(/\[img\].*?\[\/img\]/)
["[img]......[/img]", "[img]......[/img]"]

Имейте в виду, что это очень конкретный ответ, основанный на вашем конкретном вопросе. Измените str, скажем, добавив тег изображения в тег изображения , и весь ад вырвется .

4 голосов
/ 24 сентября 2010

В коде Google есть ruby ​​BBCODE-парсер .

Не используйте для этого регулярное выражение.

0 голосов
/ 25 сентября 2010
str = "some html code [img]......[/img] some html code [img]......[/img]"
p str.split("[/img]").each{|x|x.sub!(/.*\[img\]/,"")}
...