Od verze 4.3.3 je možné funkci preg_match předat parametr offset, při jehož použití se může hodit regulární výraz \G
– ten strefí začátek podřetězce. Od stejné verze je také možné vypnout speciální význam všech znaků, pokud je uzavřeme mezi \Q
a \E
.
Ke greedy (.+
) a ungreedy (.+?
nebo přepínač U
) kvantifikátorům se od PHP 4.3.3 přidávají possessive (.++
). Ty snědí všechno co mohou, i kdyby to vedlo k nesplnění následující části regulárního výrazu, a dají se použít pro urychlení vyhodnocování. Místo [^"]+"
je tedy rychlejší [^"]++"
, protože automat se nebude vracet ve snaze nalézt uvozovku (díky výrazu [^"]
je jasné, že stejně žádnou nenajde).
Od PHP 4.3.3 je možné používat bohatší syntaxi u rekurzivních výrazů, protože je ale nepoužívám, k ničemu mi to není. Hodit by se snad mohlo (?1)
mimo rekurzi, které se dovoluje odkázat na předchozí masku a umožňuje tak napsat třeba výraz ([-a-z0-9._]+)@(?1)\.[a-z]+
. K dispozici jsou také pojmenované výrazy, které naplní výsledné pole kromě číselných také textovými klíči:
<?php preg_match('~^(?P<username>[-a-z0-9._]+)@(?P<domain>[-a-z0-9._]+\\.[a-z0-9]+)$~i', $email, $matches); print_r($matches); // array([0] => jakub@vrana.cz, [username] => jakub, [1] => jakub, [domain] => vrana.cz, [2] => vrana.cz) ?>
Osobně dávám u složitějších výrazů přednost tradiční syntaxi a zápisu list(, $username, $domain) = $matches
.
Novinkou pro mě je, že od PHP 4.3.5 se UTF-8 znaky kontrolují. Hodit se může i schopnost strefit v UTF-8 režimu jediný bajt – to zařídí výraz \C
.
Aktualizovaná knihovna také syntaxí (?C)
podporuje tzv. callouts. Tento mechanismus umožňuje uprostřed vyhodnocování regulárního výrazu zavolat vlastní funkci, což se dá jednak použít pro ladění, a jednak je touto funkcí možné ovlivnit další vyhodnocování výrazu (úspěch, neúspěch, částečný neúspěch). V PHP ale nejde určit, jaká funkce se má volat při dosažení calloutu, takže se tento nový obrat použít nedá. V nepovolaných rukách by podle mě mohl napáchat víc škody než užitku.
Viz také: Další novinky v PHP 5.1.
Diskuse je zrušena z důvodu spamu.