Я пытаюсь заменить тире между двумя значениями времени и заменить его словом 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);






Вы можете включить ключевое слово 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
Вы также можете захватить from , так как это должно быть в выводе \b(from \d{1,2}:\d{2})-(\d{1,2}:\d{2})
Вы можете использовать
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 Вам понадобится флаг u, например. с русским: '/\bс\s+\d{1,2}:\d{2}\K-(?=\d{1,2}:\d{2}(?!\d))/u'. К счастью, границы слов в PHP учитывают Unicode, когда используется флаг u.
Я пробовал это, и это не сработало... Но это был мой недостаток... У меня была опечатка. Теперь он работал правильно
последний вопрос... что, если время пишется с пробелом до и после тире. Вот так 08:00-20:30
@lСтойлов '/\bс\s+\d{1,2}:\d{2}\s*\K-(?=\s*\d{1,2}:\d{2}(?!\d))/u'
@WiktorStribiżew, это тоже подходит ко всем случаям