Avatar billede BTEngineer Novice
27. januar 2006 - 09:40 Der er 10 kommentarer og
1 løsning

Test om # er i starten?

Hej,

Er der nogle der kan sige mig, hvordan man tester om # er i starten af indtastningen i feltet.

Det er meningen at det skal være en farvekode, f.eks.
#FFFFFF, den skal teste om # er med i staren, dvs. den må f.eks. ikke være F#FFFFF.

Nogen der kan hjælpe?

Tak på forhånd
Avatar billede nielle Nybegynder
27. januar 2006 - 09:49 #1
$str = "F#FFFFF";

if (preg_match("/#?[0-9abcdef]{6}/i", $str))
    echo "Korrekt formateret farvekode.";
else
    echo "Fejl!";
Avatar billede nielle Nybegynder
27. januar 2006 - 09:50 #2
Acceptere også at #-tegnet slet ikke er der.

Hvis det *skal* vær der, kan du bruge:

$str = "F#FFFFF";

if (preg_match("/^#[0-9abcdef]{6}$/i", $str))
    echo "Korrekt formateret farvekode.";
else
    echo "Fejl!";
Avatar billede nielle Nybegynder
27. januar 2006 - 09:50 #3
Mønsteret i 27/01-2006 09:49:19 skal lige rettes til:

if (preg_match("/^#?[0-9abcdef]{6}$/i", $str))
Avatar billede showsource Seniormester
27. januar 2006 - 09:57 #4
Hvorfor ikke bare
if($_POST["farvekode"]{0} == "#") {
//ok
}
Avatar billede nielle Nybegynder
27. januar 2006 - 10:07 #5
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. :^)
Avatar billede showsource Seniormester
28. januar 2006 - 08:01 #6
Jow, men er alle de tegn i hvilken som helst rækkefølge gyldig farvekode?
Avatar billede nielle Nybegynder
28. januar 2006 - 08:49 #7
Hvis de følger mønsteret ^#?[0-9abcdef]{6}$ - ja, så er det en gyldig farvekode.

Der er selvfølgelig ingen garanti for at koden dækker over en af de web-ægte farvekoder.
Avatar billede BTEngineer Novice
30. januar 2006 - 14:58 #8
Nielle, forstår ikke så meget af koden. Kan du ikke forklarer hvad det hele står for, f.eks. / $/i osv.
Avatar billede nielle Nybegynder
30. januar 2006 - 19:21 #9
Jeg kan da give det et forsøg:

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. :^)
Avatar billede BTEngineer Novice
31. januar 2006 - 14:22 #10
Tusinde tak :)
Det hjalp virkelig :)

Smid da lige et svar :)
Avatar billede nielle Nybegynder
31. januar 2006 - 17:18 #11
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

Seneste spørgsmål Seneste aktivitet
I går 21:00 Libre Office Impress Af Frank i Andre styresystemer
I går 11:47 VB script Af Jenshentze i Word
I går 11:21 Popup ved opstart Af mort1 i Windows
04/0918:50 Slet lokal konto Af ErikHg i Windows
04/0916:05 Ændre tal i en celle Af xvid i Excel