PHP: регулярное выражение для замены тире, только если перед ним есть определенное слово и число

Я пытаюсь заменить тире между двумя значениями времени и заменить его словом to, но только если перед первым значением времени стоит слово from

Это то, что у меня есть до сих пор, которое работает нормально, но оно соответствует всем случаям, когда есть два таймфрейма с прочерком между ними.

$text = "The Spa center works 08:00-20:30 every day";
$text = preg_replace('/(\d{1,2})\-(\d{1,2})/','$1 to $2', $text);

И что я хочу, чтобы это срабатывало, только если предложение выглядит так

Спа-центр работает from 08:00-20:30 каждый день

Таким образом, желаемый результат должен быть

Спа-центр работает с 08:00 to 20:30 каждый день

Окончательное решение

Благодаря помощи @Wiktor Stribiżew окончательное решение будет соответствовать также Unicode и пробелам между двумя таймфреймами, и тире выглядит так.

$text = preg_replace('/\bfrom\s+\d{1,2}:\d{2}\s*\K-(?=\s*\d{1,2}:\d{2}(?!\d))/u','$1 to $2', $text);

@WiktorStribiżew, это тоже подходит ко всем случаям

lStoilov 23.01.2023 13:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете включить ключевое слово from в свой шаблон регулярного выражения:

$text = "The Spa center works from 08:00-20:30 every day";
$text = preg_replace('/\bfrom (\d{1,2}:\d{2})-(\d{1,2}:\d{2})/','from $1 to $2', $text);
echo $text;  // The Spa center works from 08:00 to 20:30 every day

Это работает, но также удаляет слово from. Так получается The Spa center works 08:00 to 20:30 every day

lStoilov 23.01.2023 13:15

Вы также можете захватить from , так как это должно быть в выводе \b(from \d{1,2}:\d{2})-(\d{1,2}:\d{2})

Ted Lyngmo 23.01.2023 13:15
Ответ принят как подходящий

Вы можете использовать

preg_replace('/\bfrom\s+\d{1,2}:\d{2}\K-(?=\d{1,2}:\d{2}(?!\d))/',' to ', $text)

Посмотрите демонстрацию регулярного выражения

Подробности:

  • \b - граница слова
  • from - слово from
  • \s+ - один или несколько пробелов
  • \d{1,2}:\d{2} - одна или две цифры, :, две цифры
  • \K - пропустить совпадающий текст
  • - - дефис
  • (?=\d{1,2}:\d{2}(?!\d)) - сразу справа должна быть одна или две цифры, : две цифры, за которыми не следует еще одна цифра.

только еще один вопрос. Если слово не from, а другой язык, то есть Юникод? Например, вместо from быть от. Как мне это сделать?

lStoilov 23.01.2023 13:45

@lStoilov Вам понадобится флаг u, например. с русским: '/\bс\s+\d{1,2}:\d{2}\K-(?=\d{1,2}:\d{2}(?!\d))/u'. К счастью, границы слов в PHP учитывают Unicode, когда используется флаг u.

Wiktor Stribiżew 23.01.2023 13:46

Я пробовал это, и это не сработало... Но это был мой недостаток... У меня была опечатка. Теперь он работал правильно

lStoilov 23.01.2023 13:49

последний вопрос... что, если время пишется с пробелом до и после тире. Вот так 08:00-20:30

lStoilov 23.01.2023 13:53

@lСтойлов '/\bс\s+\d{1,2}:\d{2}\s*\K-(?=\s*\d{1,2}:\d{2}(?!\d))/u'

Wiktor Stribiżew 23.01.2023 14:02

Другие вопросы по теме