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
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
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
preg_replace('#aaa(?!x)#', '!', 'aaab'); // palauttaa '!b'
?>
Annettu merkkijono, joka sisältää funktion nimiä:
<?php
$str = 'func1() func2() func3()';
?>
Hanki taulukko funktioiden nimistä merkkijonosta.
Annettu merkkijono tagilla:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Hanki taulukko tämän tagin attribuuttien nimistä.