Regex головная боль с многострочным текстом с переполнением стека

Я отформатировал текстовые данные, извлеченные из PDF, как это:

AB01234 This could be a

long question with multiple

new lines a)these b)are c)the responses which could

contains new lines d)either b

AB01235 This is another question with same multiple

response a) one b) two c) three d) four c

...

Моя цель — сгруппировать идентификаторы вопросов, вопросы, ответы и правильный ответ, который является последним символом. Есть ли способ сделать это с помощью регулярного выражения?

{
[0] => 'AB01234',
[1] => 'This could be a long question with multiple new lines',
[2] => 'these'
[3] => 'are',
[4] => 'the responses which could contains new lines',
[5] => 'either',
[6] => 'b'
}

-1

Решение

Я бы не стал делать это с помощью одного регулярного выражения. Слишком большая разница во входных данных. Я бы очистил текст так:

$text = '
AB01234 This could be a
long question with multiple
new lines a)these b)are c)the responses which could
contains new lines d)either b
AB01235 This is another question with same multiple
response a) one b) two c) three d) four c
';
$text = preg_replace('/([A-Z]{2}[0-9]{5})/', ' QUESTION\1 ', $text);
$text = preg_replace('/([a-z]\))/', ' ANSWER\1 ', $text);
$text = trim(preg_replace('/\s+/', ' ', $text));
print($text);

Вы увидите, что текст теперь довольно чистый. Это одна строка. Интервал очищен. У вас также есть четкие флаги для ВОПРОС и ОТВЕТ. Вы можете поменять их на что угодно, например! @ # $ # @! # Для вопроса. Они просто должны быть чем-то, что никогда не появится в тексте.

Теперь вы можете попробовать регулярное выражение, но в этот момент разбить проще, потому что вы пометили разделители. В этом примере я много раз взрывал и взрывал, на тот случай, если вы его не видели много. Вы не должны использовать это. Вы можете использовать регулярные выражения или подстроки.

$questions = array();
$qas = explode("QUESTION", $text);
foreach($qas as $qa)
{
if($qa == "") continue;
$answers = explode("ANSWER", $qa);
$q = array();
foreach($answers as $i=>$answer)
{
$a = explode(' ', $answer);
if($i == 0) $q[] = $a[0];
$questions[0] = $a[0];
array_shift($a);
$q[] = implode(' ', $a);
}
$questions[] = $q;
}
print_r($questions);

Теперь у вас должен быть массив, который вы хотите.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]