PHP:正则表达式替换破折号只有当它前面有特定的单词和数字

bwntbbo3  于 2023-01-24  发布在  PHP
关注(0)|答案(2)|浏览(105)

我尝试将两个时间值之间的破折号替换为单词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);

我想让它只在句子看起来像这样的时候触发

水疗中心每天08:00-20:30开放

所以理想的结果应该是

水疗中心每天从08:00 to 20:30开始工作
最终解决方案

多亏了@Wiktor Stribizew的帮助,最终的解决方案,将匹配两个时间帧之间的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);
wztqucjr

wztqucjr1#

您可以使用

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

参见regex demo

  • 详细信息 *:
  • \b-字边界
  • from-一个字from
  • \s+-一个或多个空格
  • \d{1,2}:\d{2}-一位或两位,:,两位
  • \K-忽略匹配的文本
  • --连字符
  • (?=\d{1,2}:\d{2}(?!\d))-紧挨着右边,必须有一个或两个数字,:,两个数字后面不跟另一个数字。
anauzrmj

anauzrmj2#

您可以在regex模式中包含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

相关问题