Fordi at du skal læse imellem linjerne... det dounie i virkeligheden ønsker er en funktion, som kan validere en farvekode. F.eks. skal "F#FFFFF" afvises. :^)
Funktionen preg_match() forsøger at matche noget imod et regulært udtryk for at se om det passer med det. Det regulære udtryk er i dette tilfælde:
^#[0-9abcdef]{6}$
og det der skal matches imod det er indholdet af din streng $str. Man kalder også sådan en som den der for et mønster (et pattern) fordi at det kan opfattes som et mønster for hvordan strengen må se ud.
Vi kigger på mønsteret bid for bid:
(1)
Tegnet ”#” betyder blot at ”her skal stå et #-tegn”. Din farvekode skal altså starte med et # tegn for at være ”lovlig”.
(2)
Dernæst kommer et sæt []-parenteser med en masse regn inden i. De skal læses som ”et af disse tegn”, og derfor betyder:
[0-9abcdef]
blot ”et af tegnene 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e eller f”. Læg mærke til at ”0-9” altså skal læses som ”et af tegnene 0, 1, 2, 3, 4, 5, 6, 7, 8 eller 9”. Rent faktisk kunne man, nu når jeg tænker på det, også have skrevet dette del-mønster som:
[0-9a-f]
som altså skal læses som ”et af tegnene 0 til 9, eller et af tegnene a til f”.
Mønsteret kan også læses på en anden form: ”et hexadecimalt ciffer”.
(3)
Dette efterfølges af:
{6}
som betyder ”6 styk” - altså lige præcis 6, og hverken mere eller mindre. Sammensat betyder:
[0-9abcdef]{6}
derfor ”6 hexadecimale cifre” - lige præcis det antal som indgår i en lovlig farvekode.
Dimsen ”{6}” er i øvrigt blot en variant af nogle mere generelle:
{6} - præcis 6 styk {2,7} – mellem 2 og 7 styk {,8} – 0 til 8 styk {5,} - 5 eller flere styk
Til dem så har vi ”*” som er en kort måde at skrive ”{0,}” (”0 eller flere”) og ”+” som er en kort måde at skrive ”{1,}” (”mindst 1 eller flere”).
(7)
I alt har vi nu:
#[0-9abcdef]{6}
som læses ”et #-tegn efterfulgt af 6 hexadecimale cifre”.
Dertil har vi et ”^” i starten og et ”$” i enden. Disse kaldes for ankre (”anchors”) og de bruges til angive at ”starten af strengen” hhv. ”enden af strengen”.
Mønsteret:
#[0-9abcdef]{6}
ville faktisk matche en lovlig farvekode som f.eks. ”#ff0000”, men den vil også matche en masse ulovlige farvekoder som f.eks.:
$str = "noget tekst hvor farvekoden #ff0000 indgår i";
Det skyldes at mønsteret matcher den lovlige del midt i strengen, og at den derfor matcher hele strengen. Det er denne situation som ”^” og ”$” tager højde for. ”^” tegnet betyder at ”her starter strengen”, og da ”#” tegnet kommer umiddelbart efter, så betyder det altså at ”der er ikke noget foran # tegnet” eller ”# tegnet er i starten af strengen”.
På samme måde skal ”$” tegnet kobles til enden af strengen.
Derfor betyder:
^#[0-9abcdef]{6}$
at ”strengen består af et # tegn efterfulgt af 6 hexadecimale cifre, og der er hverken noget før eller efter”.
(8)
I indlægget 27/01-2006 09:50:57 sneg der sig et lille ”?” tegn ind:
^#?[0-9abcdef]{6}$
Det læses som ”dette tegn er valgfrit”. En anden måde at skrive dette på er i øvrigt ”{0,1}” (se punkt 6 ovenfor).
Altså ”strengen består måske, måske ikke, af et # tegn fulgt af 6 hexadecimale cifre”. Dette mønster ville acceptere både ”#ff0000” og ”ff0000”.
(9)
Tilsidst er det hele pakket ind i en preg_match():
if (preg_match("/^#?[0-9abcdef]{6}$/i", $str))
hvor der altså er tilføjet:
"/ ... /i"
rundt om mønsteret. Der er ikke så meget at forklare – sådan skal det bare se ud. Dog er der lige det lille ”i”, som skal læse som ”ignore case” eller ”case Insensitive”. Det betyder at vi ikke ønsker at skelne mellem store og små bogstaver – farvekoderne ”#ff0000” og ”#FF0000” er lig gode.
Håber at det kastede lyd over sagen? Og ellers må du meget gerne spørge igen. :^)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.