PHP:s "regular expression"

Det har kommit upp några frågor om hur man kan kolla om ett lösenord bara innehåller siffor och bokstäver, eller hur man kollar om en e-postadress är korrekt. Det bästa sättet tycker jag är att lära sig “regular expressions”. PHP stöder två typer av “regular expression”.

  • preg - som är en PHP wrapper av PCRE library (Perl-Compatible Regular Expressions).
  • ereg - som bygger på POSIX Extended Regular Expressions från 1986, det har hänt mycket sen dess.
ereg vs preg

När man skall jobba med “regular expression” i PHP så tycker jag att man skall jobba med preg funktioner. De är för det mesta dubbelt så snabba och klarar av mer avancerade saker, dessutom verkar det som om ereg är på väg bort från PHP. Kan idag inte komma på någon anledning att använda ereg funktionerna.

Läs mer om preg-funktoner och om syntax.

Bra sida att testa på
Några lätta exempel för att komma igång.
$preg = "/exempel/"; // Avgränsare får inte vara alphanumeric eller backslash... Allt annat verkar funka!
$string = "Några lätta exempel för att komma igång.";
if (preg_match($preg, $string)) {
	echo "Success: '$preg' matchar '$string'<br>";
} else {
	echo "Error: '$preg' matchar inte '$string'<br>";
}
// Skriver ut : Success: '/exempel/' matchar 'Några lätta exempel för att komma igång.'
 
// Sen när man kan "regular expression" så är kan man även använda preg_replace...
$string = preg_replace ($preg, 'saker', $string);
echo "'$string'<br>";
// Skriver ut: 'Några lätta saker för att komma igång.'
 
 
/* 
Om man vill göra lite krångligare saker så måste man känna till lite mer.
^ - används för start
$ - används för slut
 
. - betyder valfritt tecken, vill man ha just en . använd \.  
Använd \ för alla dessa tecken: \ ^ . $ | ( ) [ ] * + ? { } ,
* - 0 eller fler tecken
+ - 1 eller fler tecken
? - 0 eller ett tecken
{3} - 3 tecken
{3,} - Minst 3 tecken
{3,6} 3 till 6 tecken
 
(hej) - en sekvens ex: (hej){1,3} matchar hej, hejhej, hejhejhej
| - Funkar som or ex: "(b|cd)ef": matchar "bef" eller "cdef".
 
[] Godkänner allt inom [] som match. ex: [abc] matchar a, b eller c, [abc] är samma sak som (a|b|c)
[0-9] - Matchar en siffra
[a-z] - Matchar en bokstav mellan a till z
[a-zåäö] - Matchar våra svenska små bokstäver
[0-9a-zA-ZåäöÅÄÖ] - Matchar siffor och våra svenska bokstäver, både stora och små.
 
^ - kan också betyda inte ex: "/^[^abc]*$/" matchar så länge inget av a, b eller c är med
 
Sen är det bara att kombinera alla saker ovan så kommer du nog att kunna matcha det mesta ;-)
*/
 
// och nu något man kan ha nytta av...
$preg = "/http:\/\/([0-9a-z-\._]*)/";
$string = "En länk till Parkskolans hemsida (http://www.park.se) som vi vill göra klickbar!";
$replace = '<a href="http://$1">$1</a>';
echo preg_replace ($preg, $replace, $string);
// Skriver ut: En länk till Parkskolans hemsida (<a href="http://www.park.se">www.park.se</a>) som vi vill göra klickbar!
 
// och allra sist något man troligen inte har nytta av ;-)
$preg = "/.*(Ett).*(hej).*(hå).*/";
$string = "Hå och hej, Ett hej och hå, hej säg så";
$replace = "$1 $3 och $2";
echo preg_replace ($preg, $replace, $string);
// Skriver ut: Ett hå och hej
Nu skall ni skriva några "Regular Expressions" som matchar följande:
  1. Bara små bokstäver (a-z) och 4-6 tecken.
  2. Bara små bokstäver a-z och siffror, dock minst 8 tecken.
  3. Ett heltal mellan 0-999.
  4. En korrekt E-post adress. (Jag tycker att en korrekt e-post adress bara får innehålla a-z,0-9 punkt(.), underline(_) och tankesträck(-) före @ och efter bara a-z,0-9 punkt(.) och tankesträck(-) fastän RFC:n tillåter fler tecken…)
  5. Ett heltal mellan 0-255.
  6. Datum på formen yyyy-mm-dd mellan 1900-01-01 och 2099-12-31, det är ok att alla månader kan ha 31 dagar…