Как создать свой формат файла или как сохранить 300 вопросов с вариантами в одном файле?
Не вижу проблем с хранением всего в JSON-файле с кодированием бинарных данных в Base64 (так изображения хранить проще простого; про формулы в конце). JSON парсить в php (да и вообще) – проще некуда. Сохранение в JSON-файл из *.doc/docx можно реализовать макросом-скриптом на Visual Basic за половину рабочего дня.
Если не планируется какое либо распространение этого софта и заранее известно окружение (например система тестирования в университете с определенной версией MS Office =) ), то можно использовать автоматизацию приложений MS Office. Насколько помню, на том же Delphi довольно просто прикручивался кастомный GUI к документу MS Office при наличии хоть какого опыта работы с технологией COM. В таком случае достаточно будет лишь правильно разметить документ. С веб-версией, в случае ее необходимости, придется обращаться к .NET-платформе (хотя наверняка в MSDN уже есть мануал с сорцами на эту тему).
И стоит напомнить: *.docx – это не более чем переименованный *.zip с файлами в xml-формате. Не знаю как там хранятся изображения, но парсить распакованную структуру не должно составить большого труда средствами любого языка программирования.
Что является формулами я не смог понять из вопроса. Если объекты *math* или как там в MS Office они зовуться, то тут нужно искать решение. Например отрендерить предварительно =)). Вроде когда из .docx импортировали в *.doc для Office 2003 так и было.
Главный вопрос — не количество вариантов и вопросов, а какие возможности разметки хотите реализовать? Вы упомянули формулы, картинки. В каком именно формате планируете хранить содержимое вопроса?
Если это вордовская разметка, то может и хранить всё как в ворде - зипованые xml. Если формат html - то и хранить в нём (фото и прочие бинарные файлы в нем-же, в base64).
Для индекса и быстрого поиска по нему ("чтобы легко достать случайные 25 вопросов") можно построить json или xml.
Или воспользуйтесь SQLite - просто сложите всё туда. Но всё равно, сначала необходимо определиться с форматом контейнера вопроса.