regex — Как preg_replace же элементы в одной теме php?

У меня вопрос по одному делу.

Я использую функцию php preg_replace () для форматирования данных из этой строки:

12:05 Place1 12:40 14:00 16:30 Place2 "Test" 29 Janury

Мне нужно, чтобы это звучало так:

<li>29 January - Place1 - 12:05</li>
<li>29 January - Place2 "Test" - 12:40 14:00 16:30</li>

Мое регулярное выражение:

/(\d[0-9]:\d[0-9]).+?(\D+).+?(\d[0-9]\s(January|February|March))/

В настоящее время я использую что-то вроде этого:

$text = "12:05 Place1 12:40 14:00 16:30 Place2 "Test" 29 Janury";
$data = preg_replace("/(\d[0-9]:\d[0-9]).+?(\D+).+?(\d[0-9]\s(January|February|March))/", "<li>$3 - $2 - $1</li>", $text);
echo $data;

Проблема показывает только первые совпадения,

  • 29 января — 1 место — 12:05
  • Может кто знает как решить это дело?

    Спасибо 🙂

    1

    Решение

    Это невозможно сделать в одном регулярном выражении, потому что вы хотите использовать совпадение с конца строки до того, как механизм PCRE достигнет его. Вам нужно сделать это в два этапа:

    1. preg_match() с PREG_OFFSET_CAPTURE чтобы захватить дату с конца строки в другую переменную. Используйте смещение, которое это обеспечивает, чтобы обрезать оригинальную строку.
    2. preg_match_all() усеченная строка, чтобы получить время & помещает как массив, затем итерирует массив для использования каждого совпадения & переменная даты для создания списка. '/((?:\s*+\d\d:\d\d)++)\s++((?:.(?!\d\d:\d\d\s))++)\s*+/' это подходящий шаблон.
    0

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

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

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