PHP preg_replace:帮帮我grok(?= :)

时间:2009-12-16 16:25:19

标签: php regex preg-replace

another question中,有以下几行:

$value='x-Cem-Date:Wed, 16 Dec 2009 15:42:28 GMT';
$value = preg_replace('/(^.+?)(?=:)/e', "strtolower('\\1')", $value);
// yields 'x-cem-date:Wed, 16 Dec 2009 15:42:28 GMT'

(?=:)位表示搜索冒号,它必须。但是,我不理解?=的特定语法。究竟是怎么回事?

1 个答案:

答案 0 :(得分:5)

那是positive lookahead。它查看特定的子表达式是否在之后发生。但它不会消耗匹配中的任何内容:

  

积极前瞻的作用是一样的。 q(?=u)匹配后跟q的{​​{1}},而不会匹配u部分。正前瞻构造是一对圆括号,开口括号后跟一个问号和一个等号。 - RegularExpressions.info

您可能会注意到,在替换文本时,环视特别有用,因为您不需要将周围环境包含在替换文本中。例如,要替换u之后没有跟q u的每个qu,您可以执行

replace 'q([^u])' by 'qu\1'

但是它会捕获以下字符,因为它是匹配的一部分,然后再次重新插入。您还可以使用环视:

replace 'q(?!u)' by 'qu'

只有q匹配并被替换,因此不再需要在替换字符串中包含部分匹配。