При условии отсутствия ограничений на то, что может быть в процентах обернутых токенов (включая экранированные символы) и какие символы могут быть экранированы (таким образом, экранирование также может быть экранировано: \\%token%
должно быть допустимым),
вот шаблон, который вы можете использовать, чтобы пропустить экранированные символы:
\\.|(%([^%\\]|\\.)+%)
Это позволит получить токены в процентах и в первой группе ($1
). Экранированные символы также будут сопоставлены (это хороший способ пропустить их), но с помощью PHP очень просто получить только соответствующие токены:
preg_match_all('/\\\\.|(%([^%\\\\]|\\\\.)+%)/', $str, $matches, PREG_PATTERN_ORDER);
$matches = array_filter($matches[1]);
Рабочий пример: http://ideone.com/dziCB