Regex с предвидением и взглядом сзади

У меня есть следующее регулярное выражение, которое прекрасно работает.

$str = "ID: {{item:id}} & First name: {{item:first_name}} & Page Title: {{page:title}}";

preg_match_all('/(?<={{)[^}]*(?=}})/', $str, $matches);

print_r($matches);

Returns:
Array
(
[0] => Array
(
[0] => item:id
[1] => item:first_name
[2] => page:title
)
)

Как мне нужно изменить регулярное выражение так, чтобы оно совпадало только с item: id и item: first_name (или любой другой строкой, начинающейся с «item:»)? Я попытался добавить «элемент» в регулярное выражение (в нескольких разных местах), но это не сработало.

1

Решение

Ты можешь использовать:

preg_match_all('/(?<={{)item:[^}]*(?=}})/', $str, $matches);

print_r($matches[0]);
Array
(
[0] => item:id
[1] => item:first_name
)
1

Другие решения

Благодаря этому вы можете сгруппировать токены, поэтому вам не нужно ограничивать выражение каким-либо одним типом:

(?<={{)(.+?)(?:\:)(.+?)(?=}})

Пример использования:

$str = "ID: {{item:id}} & First name: {{item:first_name}} & Page Title: {{page:title}}";

preg_match_all('/(?<={{)(.+?)(?:\:)(.+?)(?=}})/', $str, $matches);

$tokens = array();

foreach ($matches[0] as $i => $v) {
$tokens[$matches[1][$i]][] = $matches[2][$i];
}

echo '<pre>';
print_r($tokens);

Выход:

Array
(
[item] => Array
(
[0] => id
[1] => first_name
)

[page] => Array
(
[0] => title
)

)
0

По вопросам рекламы [email protected]