Ereg-functies
Inhoud
- 1 - Omzetten naar str_replace
- 2 - Omzetten naar ctype_*
- 3 - Omzetten naar preg_*
- 4 - ereg
- 5 - eregi
- 6 - ereg_replace
- 7 - eregi_replace
Sinds PHP 5.3 zijn deze functies deprecated:
Dit zal nu notices en in de toekomst foutmeldingen op gaan leveren. Dat is goed, want er zijn betere functies voorhanden, dus daarop overstappen is wel zo slim. Helaas zwerven er nog heel veel scriptjes over het internet waarin deze verouderde functies gebruikt worden. Gelukkig is het heel simpel om ze om te zetten naar de moderne variant: preg_match() en preg_replace(). Sterker nog, regelmatig was de ereg()-functie niet eens nodig en kan je andere, makkelijkere en snellere functies gebruiken.
Omzetten naar str_replace
Soms worden regular expressions ingezet om letterlijke strings door andere strings te vervangen. Dit is niet nodig, omdat daarvoor str_replace() en str_ireplace() gebruikt kunnen worden.
Wil je bijvoorbeeld alle smileys '=)' vervangen door '<img src="/img/smile.gif" />', zoals hier:
| 1 | $parsed = ereg_replace('=)','<img src="/img/smile.gif" />',$unparsed); |
In dat geval heb je helemaal geen ereg_replace() nodig en kan je str_replace() gebruiken:
| 1 | $parsed = str_replace('=)','<img src="/img/smile.gif" />',$unparsed); |
Gebruikt je eregi_replace() om case-insensitive te vervangen, dan kan je str_ireplace() gebruiken. Stel je wilt [myname] vervangen door de $username, maar [MyName] en [MYNAME] etc moeten ook werken:
| 1 | $parsed = str_ireplace('[myname]',$username,$unparsed); |
Deze functies zijn niet alleen sneller, maar ook een stuk makkelijker te begrijpen.
Omzetten naar ctype_*
ereg() en eregi() worden regelmatig gebruikt om invoer te valideren. Nu is dit bij uitgebreidere dingen wel nodig (postcode, e-mail), maar als je gewoon wilt testen of iets alfanumeriek is, of enkel hoofdletters, etc, kan je ctype_* gebruiken.
Stel je wilt dat een username alfanumeriek is (alleen letters en cijfers). Dan kan je dit checken met een trage en lastiger leesbare ereg:
| 1 2 3 4 5 6 | if ( ereg('^[a-zA-Z0-9]*$', $_POST['username'] ) {
// Correcte naam
}
else {
// Incorrecte naam
} |
Je kan het echter ook netjes vervangen door ctype_alnum():
| 1 2 3 4 5 6 | if ( ctype_alnum( $_POST['username'] ) ) {
// Correcte naam
}
else {
// Incorrecte naam
} |
Zie hier wat er allemaal standaard mogelijk is:
ctype_alnum — Check for alphanumeric character(s) ctype_alpha — Check for alphabetic character(s) ctype_cntrl — Check for control character(s) ctype_digit — Check for numeric character(s) ctype_graph — Check for any printable character(s) except space ctype_lower — Check for lowercase character(s) ctype_print — Check for printable character(s) ctype_punct — Check for any printable character which is not whitespace or an alphanumeric character ctype_space — Check for whitespace character(s) ctype_upper — Check for uppercase character(s) ctype_xdigit — Check for character(s) representing a hexadecimal digit
Staat het er niet tussen, dan zal je het moeten omzetten naar een preg_*-functie
Omzetten naar preg_*
Wanneer je er zeker van bent dat je een regular expression nodig hebt, kan je de nieuwe equivalent, de preg_*-functies gebruiken. Gelukkig is het niet moeilijk om het om te zetten.
ereg
De functie ereg() controleert of een bepaalde string matcht met een bepaalde regular expression. Zo kan je bijvoorbeeld kijken of er 4 cijfers gevolgd door 2 hoofdletters voorkomen in een string:
| 1 | if ( ereg('\d{4}[A-Z]{2}', $teststring ) { |
Deze functie is vervangen door preg_match(), die vrijwel identiek werkt. Het verschil zit hem erin dat je de regular expression moet omsluiten met een delimiter teken, dat je zelf kan kiezen. Dit zul je dan wel moeten escapen als het voorkomt in de expressie. Je kunt ook accolades al delimiter gebruiken. Bovenstaande code wordt dan dus:
| 1 | if ( preg_match('#\d{4}[A-Z]{2}#', $teststring ) { |
of
| 1 | if ( preg_match('~\d{4}[A-Z]{2}~', $teststring ) { |
of
| 1 | if ( preg_match('{\d{4}[A-Z]{2}}', $teststring ) { |
eregi
eregi() is als ereg(), met als verschil de i van case Insensitive. Met andere woorden: deze werkt identiek, maar ziet geen verschil tussen hoofd- en kleine letters. Als je bijvoorbeeld zoekt naar 5 tot 10 letters (groot of klein) met rechte haken eromheen, zou het zijn:
| 1 | if ( eregi('\[[a-z]{5,10}]', $teststring ) { |
Er bestaat geen preg_matchi(), er zijn echter wél modifiers die je toe kan voegen aan je expressie. Deze zet je dan ná de afsluitende delimiter. In ons voorbeeld wordt het dan:
| 1 | if ( preg_match('{\[[a-z]{5,10}]}i', $teststring ) { |
Zoals je ziet is ook hier de modifier: i.
ereg_replace
De functie ereg_replace is vervangen door preg_replace. De functie zoekt niet alleen wat er 'matcht' met de expressie, maar vervangt het ook door iets anders. Je moet op een vergelijkbare de expressie aanpassen door er delimiters omheen te zetten.
Stel je hebt deze code om alle postcodes zonder spatie om te zetten naar postcodes mét spatie:
| 1 | $metSpaties = ereg_replace( '([0-9]{4})([A-Z]{4})', '$1 $2', $zonderSpaties ); |
Met de preg_replace()-functie zou het dan worden:
| 1 | $metSpaties = preg_replace( '$([0-9]{4})([A-Z]{4})$', '$1 $2', $zonderSpaties ); |
of
| 1 | $metSpaties = preg_replace( '{([0-9]{4})([A-Z]{4})}', '$1 $2', $zonderSpaties ); |
eregi_replace
Ook de preg_replace()-functie maakt gebruik van de modifiers en er bestaat dan ook geen preg_replacei(). Stel je wilt bovenstaand voorbeeld hoofdletter-ongevoelig maken, dan voeg je weer een 'i' toe achter de closing delimiter:
| 1 | $metSpaties = preg_replace( '{([0-9]{4})([A-Z]{4})}i', '$1 $2', $zonderSpaties ); |

