I have seen this functionality in moodle where they upload .txt files and parse data and create question bank . Some questions have three options as well
Sample :-
What is php? A. Php is a language. B. Php creates HTML. C. Php is fun. D. none of these. ANSWER: D Which is YII-2? A. Framework. B. Tool. C. None of these ANSWER: A
Till now I have tried this to parse it but I don’t know what exactly to be done to achieve it for bulk uploading .
txt_file = file_get_contents('path/to/file.txt'); $rows = explode("n", $txt_file); array_shift($rows); foreach($rows as $row => $data) { }
Array I am trying to acquire
[ [ 'question' => 'Php is a language.', 'options' => [ 'A' => 'Php is a language.', 'B' => 'Php creates HTML.', 'C' => 'Php is fun.', 'D' => 'none of these.' ], 'answer' => 'D' ], ..... ]
Sample file:- File code fbSObnlghQkqroEk4lrQ
Advertisement
Answer
Multiple answer logic
edit – forgiving version
Try (?mi)^(?!h*(?:[A-Z]h*.|ANSWERh*:))h*(?<question>S.*?)??h*s*^h*Ah*.h*(?<A>.*?)h*s*(?:^h*Bh*.h*(?<B>.*?)h*(?:s*^h*Ch*.h*(?<C>.*?)h*(?:s*^h*Dh*.h*(?<D>.*?)h*(?:s*^h*Eh*.h*(?<E>.*?)h*)?)?)?)?s*^h*ANSWERh*:h*(?<answer1>[A-F])(?:h*,h*(?<answer2>[A-F]))?
match in loop, create single array from parts,
append to larger array.
not need ‘options’ but after match can create sub-array from groups A-E
then add to single array.
repeat on next match.
<?php // Your code here! $regex = '~(?mi)^(?!h*(?:[A-Z]h*.|ANSWERh*:))h*(?<question>S.*?)??h*s*^h*Ah*.h*(?<A>.*?)h*s*(?:^h*Bh*.h*(?<B>.*?)h*(?:s*^h*Ch*.h*(?<C>.*?)h*(?:s*^h*Dh*.h*(?<D>.*?)h*(?:s*^h*Eh*.h*(?<E>.*?)h*)?)?)?)?s*^h*ANSWERh*:h*(?<answer1>[A-F])(?:h*,h*(?<answer2>[A-F]))?~'; // Declare a string $nameString = 'What is php? A. Php is a language. B. Php creates HTML. C. Php is fun. D. none of these. ANSWER: D Linux is A. A Graphic Software B. A Driver C. A Line Controller Software D. An Operating System ANSWER: D Which feature helps in compress and contain the collection of files in to one A. Zip B. Shortcut C. Icon D. Extract ANSWER: A Which is YII-2? A. Framework. B. Tool. C. None of these ANSWER: A,B'; // Use preg_match_all() function $QA = []; // All questions if ( preg_match_all($regex, $nameString, $matches, PREG_SET_ORDER) ) { foreach ($matches as $match) { $qa = []; // Single question $qa['question'] = $match['question']; $qa['A'] = $match['A']; if ( array_key_exists( 'B', $match ) && $match['B'] ) $qa['B'] = $match['B']; if ( array_key_exists( 'C', $match ) && $match['C'] ) $qa['C'] = $match['C']; if ( array_key_exists( 'D', $match ) && $match['D'] ) $qa['D'] = $match['D']; if ( array_key_exists( 'E', $match ) && $match['E'] ) $qa['E'] = $match['E']; $qa['answer1'] = $match['answer1']; if ( array_key_exists( 'answer2', $match ) && $match['answer2'] ) $qa['answer2'] = $match['answer2']; array_push( $QA, $qa ); } } else { echo("Could not find a single question"); } print_R ( $QA); ?>
Output
Array ( [0] => Array ( [question] => What is php [A] => Php is a language. [B] => Php creates HTML. [C] => Php is fun. [D] => none of these. [answer1] => D ) [1] => Array ( [question] => Linux is [A] => A Graphic Software [B] => A Driver [C] => A Line Controller Software [D] => An Operating System [answer1] => D ) [2] => Array ( [question] => Which feature helps in compress and contain the collection of files in to one [A] => Zip [B] => Shortcut [C] => Icon [D] => Extract [answer1] => A ) [3] => Array ( [question] => Which is YII-2 [A] => Framework. [B] => Tool. [C] => None of these [answer1] => A [answer2] => B ) )