Иногда нужно решить задачу такого типа: найти
строку 'aaa'
и заменить ее на '!'
,
но только если после 'aaa'
стоит
'x'
, а сам 'x'
при этом
не заменять. Если мы попытаемся решить задачу
'в лоб', то у нас ничего не выйдет:
<?php
preg_replace('#aaax#', '!', 'aaax'); // будет '!', а надо '!x'
?>
Просмотр вперед
Для решения задачи нужен способ сказать,
что 'x'
не следует заменять. Делается
это с помощью специальных скобок (?= )
,
которые просто смотрят, но не забирают с собой.
Эти скобки называются позитивный просмотр
вперед. Позитивный - так как 'x'
(в нашем случае) должен быть - только тогда
произойдет замена.
Давайте применим эти скобки для решения нашей задачи:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // вернет '!x'
?>
Есть и негативный просмотр вперед
- (?! )
- он, наоборот, говорит, что
чего-то должно не быть. В следующем примере
замена произойдет, только если после 'aaa'
не стоит 'x'
:
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // вернет '!b'
?>
Просмотр назад
Аналогичным образом есть позитивный просмотр
назад - (?<= )
. В следующем
примере замена произойдет, только если перед
'aaa'
стоит 'x'
:
<?php
preg_replace('#(?<=x)aaa#', '!', 'xaaa'); // вернет 'x!'
?>
И есть также негативный просмотр назад
- (?<! )
. В следующем примере замена
произойдет, только если перед 'aaa'
не стоит 'x'
:
<?php
preg_replace('#(?<!x)aaa#', '!', 'baaa'); // вернет 'b!'
?>
Практические задачи
Дана строка, содержащая имена функций:
<?php
$str = 'func1() func2() func3()';
?>
Получите массив имен функций из строки.
Дана строка с тегом:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Получите массив имен атрибутов этого тега.
Дана строка с переменными:
<?php
$str = '$aaa $bbb $ccc';
?>
Получите массив имен переменных из этой строки (без доллара).