I am trying to replace a dash between two time values and replace it with the word to
but only if before the first time value there is the word from
This is what I have until now, which works fine, but it matches all the cases where there are two timeframes with a dash between them.
$text = "The Spa center works 08:00-20:30 every day";
$text = preg_replace('/(d{1,2})-(d{1,2})/','$1 to $2', $text);
And what I want it to trigger only if the sentence looks like that
The Spa center works from
08:00-20:30 every day
So the desired result should be
The Spa center works from 08:00 to
20:30 every day
Final Solution
Thanks to @Wiktor Stribiżew help, the final solution, will match also Unicode and spaces between the two timeframes and the dash looks like that.
$text = preg_replace('/bfroms+d{1,2}:d{2}s*K-(?=s*d{1,2}:d{2}(?!d))/u','$1 to $2', $text);
2
Answers
You may include the
from
keyword in your regex pattern:You can use
See the regex demo
Details:
b
– a word boundaryfrom
– a wordfrom
s+
– one or more whitespaced{1,2}:d{2}
– one or two digits,:
, two digitsK
– omit the matched text-
– a hyphen(?=d{1,2}:d{2}(?!d))
– immediately on the right, there must be one or two digits,:
, two digits not followed with another digit.