2016-07-18 23 views
1

Ich versuche, eine Multiple-Choice-Frage zu parsen, um sie in einer Datenbank zu speichern. Die Multiple-Choice-Frage hat eine Mischung von Fragen mit 2 bis 4 Möglichkeiten. HierMultiple-Choice-Liste mit regulärem Ausdruck analysieren

ist ein Beispiel:

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 
... 

Ich habe versucht, es in PHP zu analysieren regulären Ausdrücken, und hier ist der Ausdruck, den ich mit so weit habe kommen:

/(?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 

Aber wenn verfügbar, wird Auswahl D mit Auswahl C zusammengeführt (oder C + D verschmilzt mit B nur im Fall von 2 Auswahlmöglichkeiten) und ich kann es nicht schaffen, sie zu trennen.

See it here

Was würden Sie vorschlagen?

Antwort

1

Versuchen Sie, die einfach "alles" (.+) Muster für eine Antwortoption ersetzt zu "alles keine '[ad])' enthält" ((?:(?![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 

Demo: https://regex101.com/r/gC0tB1/2

Hinweis: Ich habe den Modifikator x hinzugefügt, um den Ausdruck lesbarer zu machen.

Verwandte Themen