PHP preg_replace: помогите мне грок (? = :) - PullRequest
1 голос
/ 16 декабря 2009

В другой вопрос , есть следующие строки:

$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 Ответ

5 голосов
/ 16 декабря 2009

Это позитивный взгляд . Он смотрит, происходит ли конкретное подвыражение после этой точки. Но он не потребляет ничего в матче:

Позитивный прогноз работает точно так же. q(?=u) соответствует q, за которым следует u, без учета u части совпадения. Позитивная прогнозная конструкция представляет собой пару круглых скобок, с открывающей скобкой, за которой следует знак вопроса и знак равенства. - RegularExpressions.info

Как вы можете заметить, lookaround особенно полезен при замене текста, поскольку вам не нужно включать окружающую среду в текст замены. Например, чтобы заменить каждый q, за которым не следует u, на qu, вы можете сделать

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

но он захватывает следующий символ, потому что он является частью совпадения, и снова вставляет его позже. Вы также можете использовать lookaround:

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

, где только q сопоставляется и заменяется, поэтому включение части совпадения в строку замены больше не требуется.

...