Lookahead nelle espressioni regolari di PHP

A volte è necessario risolvere un problema di questo tipo: trovare la stringa 'aaa' e sostituirla con '!', ma solo se dopo 'aaa' c'è 'x', e 'x' stesso non deve essere sostituito. Se proviamo a risolvere il problema in modo diretto, non avremo successo:

php<?php
  preg_replace('#aaax#', '!', 'aaax'); // darà '!', ma dovrebbe essere '!x'
?>

Per risolvere il problema, è necessario un modo per dire che 'x' non deve essere sostituito. Questo si fa utilizzando parentesi speciali (?= ), che semplicemente controllano, ma non "consumano" i caratteri.

Queste parentesi sono chiamate lookahead positivo. Positivo - perché 'x' (nel nostro caso) deve esserci - solo allora avverrà la sostituzione.

Applichiamo queste parentesi per risolvere il nostro problema:

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

Esiste anche il lookahead negativo - (?! ) - che, al contrario, dice che qualcosa non deve esserci. Nell'esempio seguente la sostituzione avverrà solo se dopo 'aaa' non c'è 'x':

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

Data una stringa contenente nomi di funzioni:

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

Ottieni un array dei nomi delle funzioni dalla stringa.

Задание 2

Data una stringa con un tag:

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

Ottieni un array dei nomi degli attributi di questo tag.