Lookahead em expressões regulares do PHP

Às vezes, é necessário resolver um problema do tipo: encontrar a string 'aaa' e substituí-la por '!', mas apenas se depois de 'aaa' houver 'x', sem substituir o próprio 'x'. Se tentarmos resolver o problema 'diretamente', não conseguiremos:

php<?php
  preg_replace('#aaax#', '!', 'aaax'); // retornará '!', mas deveria ser '!x'
?>

Para resolver a tarefa, é necessária uma maneira de dizer que o 'x' não deve ser substituído. Isto é feito usando colchetes especiais (?= ), que apenas verificam, mas não capturam.

Esses colchetes são chamados de lookahead positivo. Positivo - porque o 'x' (no nosso caso) deve estar presente - só então a substituição ocorrerá.

Vamos aplicar esses colchetes para resolver nossa tarefa:

php<?php
  preg_replace('#aaa(?=x)#', '!', 'aaax'); // retornará '!x'
?>

Existe também o lookahead negativo - (?! ) - que, pelo contrário, diz que algo não deve estar presente. No próximo exemplo, a substituição ocorrerá apenas se depois de 'aaa' não houver 'x':

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

Dada uma string contendo nomes de funções:

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

Obtenha um array com os nomes das funções a partir da string.

Задание 2

Dada uma string com uma tag:

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

Obtenha um array com os nomes dos atributos desta tag.