skip to Main Content

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


  1. You may include the from keyword in your regex pattern:

    $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
    
    Login or Signup to reply.
  2. You can use

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

    See the regex demo

    Details:

    • b – a word boundary
    • from – a word from
    • s+ – one or more whitespace
    • d{1,2}:d{2} – one or two digits, :, two digits
    • K – 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.
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search