Eteenpäin katselu PHP:n säännöllisissä lausekkeissa

Joskus on ratkaistava tämän tyyppinen tehtävä: löydä merkkijono 'aaa' ja korvaa se merkkijonolla '!', vain jos 'aaa':n jälkeen on 'x', mutta itse 'x':tä ei tule korvata. Jos yritämme ratkaista tehtävän 'suoraan', emme onnistu:

php<?php
  preg_replace('#aaax#', '!', 'aaax'); // tulisi '!', pitäisi olla '!x'
?>

Tehtävän ratkaisemiseksi tarvitaan tapa sanoa, että 'x':ää ei tulisi korvata. Tämä tehdään erikoisilla sulkeilla (?= ), jotka vain katsovat, mutta eivät ota mukaansa.

Näitä sulkeita kutsutaan positiiviseksi eteenpäin katseluksi. Positiivinen - koska 'x':n (meidän tapauksessamme) on oltava - vain silloin korvaus tapahtuu.

Sovelletaan näitä sulkeita tehtävämme ratkaisemiseksi:

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

On olemassa myös negatiivinen eteenpäin katselu - (?! ) - se puolestaan kertoo, että jotain ei pitäisi olla. Seuraavassa esimerkissä korvaus tapahtuu vain, jos 'aaa':n jälkeen ei ole 'x':

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

Annettu merkkijono, joka sisältää funktion nimiä:

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

Hanki taulukko funktioiden nimistä merkkijonosta.

Задание 2

Annettu merkkijono tagilla:

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

Hanki taulukko tämän tagin attribuuttien nimistä.