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

php regex

67 просмотра

1 ответ

147 Репутация автора

Я пытаюсь разобрать вопрос с несколькими вариантами, чтобы сохранить его в базе данных. Вопрос с несколькими вариантами ответов включает в себя от 2 до 4 вариантов.

Вот образец:

1) First question with 4 choices ?
a) First choice b) Second choice c) Third choice d) Last choice
2) Second question with only 3 choices ? 
a) First choice b) Second choice c) Last choice
3) True or False ? 
a) True b) False
...

Я пытался разобрать его в PHP с помощью регулярных выражений, и вот выражение, которое я придумал до сих пор:

/(?P<q_num>\d{1,3})\)\s?(?P<quest>.+)\n(\s?a\)\s?)(?P<ans_a>.+)(b\)\s?)(?P<ans_b>.+)(c\)\s?)(?P<ans_c>.+)((d\)\s?)(?P<ans_d>.+))?/g

Но когда доступно, вариант D объединяется с вариантом C (или C + D объединяется с B только в случае двух вариантов), и мне не удается отделить его.

Смотрите это здесь

Что ты предлагаешь ?

Автор: Fredovsky Источник Размещён: 18.07.2016 11:59

Ответы (1)


1 плюс

8722 Репутация автора

Решение

Попробуйте заменить простой .+шаблон «что угодно» ( ) для варианта ответа на «что-либо, не содержащее« [ad]) »( (?:(?![a-d]\)).)+):

/(?P<q_num>\d{1,3})\)\s?(?P<quest>.+)\n

(\s?a\)\s?)(?P<ans_a>(?:(?![a-d]\)).)+)
   (b\)\s?)(?P<ans_b>(?:(?![a-d]\)).)+)
  ((c\)\s?)(?P<ans_c>(?:(?![a-d]\)).)+))?
  ((d\)\s?)(?P<ans_d>(?:(?![a-d]\)).)+))?
/gx

Демо: https://regex101.com/r/gC0tB1/2

NB: я добавил xмодификатор, чтобы сделать выражение более читабельным.

Автор: Dmitry Egorov Размещён: 18.07.2016 12:17
Вопросы из категории :
32x32