做一个打印模板的功能,需要替换掉模板中对应标记的内容。对于确定的替换字符串,可以使用 str_replace() 函数,但对于一个标签块内的内容处理,需要使用到正则,具体如下:

content = preg_replace('/<offline>.*?</offline>/i', '', $content);

该正则的目的是清除 <offline></offline> 之间的所有内容。但是执行的时候报错了: preg_replace(): Unknown modifier 'o'

网上查了一下,是因为正则表达式以 / 标记开始和结尾,而 </offline> 中的 / 被识别为正则的结尾,o 作为结尾处的修正符无法识别,所以报错了。

那么通常遇到这种在正则中间但包含了特别字符 / 的情况怎么处理呢? 使用 \ 转义即可。

content = preg_replace('/<offline>.*?<\/offline>/i', '', $content);

正则表达式中这种转义的方式很常见,加上去莫名觉得顺眼多了,继续执行。

执行结果发现,没有替换任何东西。确认了一下,原来默认正则是匹配单行的,需要使用修正符(modifier) s

content = preg_replace('/<offline>.*?<\/offline>/si', '', $content);

顺便说一下几个修正符的作用:

  • s 表示匹配多行
  • i 表示忽略大小写
  • . 表示匹配回车换行