Просмотр напред в регулярните изрази на PHP

Понякога трябва да решим задача от този тип: намери низ 'aaa' и го замени с '!', но само ако след 'aaa' има 'x', а самият 'x' при това да не се заменя. Ако се опитаме да решим задачата 'директно', нищо няма да стане:

php<?php
  preg_replace('#aaax#', '!', 'aaax'); // ще върне '!', а трябва '!x'
?>

За решаването на задачата е необходим начин да кажем, че 'x' не трябва да се заменя. Това се прави със специални скоби (?= ), които просто проверяват, но не вземат със себе си.

Тези скоби се наричат позитивен просмотр напред. Позитивен - защото 'x' (в нашия случай) трябва да има - само тогава ще се извърши замяна.

Нека приложим тези скоби за решаването на нашата задача:

php<?php
  preg_replace('#aaa(?=x)#', '!', 'aaax'); // ще върне '!x'
?>

Има и негативен просмотр напред - (?! ) - той, обратно, казва, че нещо трябва да липсва. В следващия пример замяната ще се извърши, само ако след 'aaa' няма 'x':

php<?php
  preg_replace('#aaa(?!x)#', '!', 'aaab'); // ще върне '!b'
?>
Задание 1

Даден е низ, съдържащ имена на функции:

php<?php
  $str = 'func1() func2() func3()';
?>

Получете масив с имената на функциите от низа.

Задание 2

Даден е низ с таг:

php<?php
  $str = '<a href="" class="eee" id="zzz">';
?>

Получете масив с имената на атрибутите на този таг.