Звучит как домашняя работа, поэтому я дам вам ключевые подсказки, а не код.
Разделить слова проще всего и действительно использует разнесение:
$words = explode(" ", $string2);
Регулярное выражение тоже довольно просто:
preg_match_all('#(\d+)~(\d+)~([*]?)#', $string1, $matches,
PREG_SET_ORDER);
Вам в основном придется проповедовать по $ match. Здесь вы найдете слово index в [1] и номер заполнения в [2]:
foreach ($matches as $row) {
list( , $word_index, $fill_number, $asteriskthingy) = $row;
Чтобы собрать выходную строку, вам необходимо:
- Получить слова $ из $ last_index в текущий $ word_index. Используйте
array_slice
здесь.
- Добавить номер заполнения.
- Или делать то, что должно означать
*
. Вы не объяснили логику этого изменения, поэтому; без понятия.