Avatar billede quercus Nybegynder
08. maj 2008 - 15:45 Der er 17 kommentarer og
1 løsning

Reg.Exp af nummer

Hey!

I PHP med ereg() eller preg_match() har jeg brug for at tjekke følgende nummer (streng):

- det må kun være tal: ereg([0-9])
- det skal være min/max 3 til 7 cifre: ereg([0-9]{3,7})
- det første cifre må ikke være 0
- det må ikke være nummeret 112
- det må heller ikke være nummeret 114

Jeg bruger trim() andet sted før indsæt i DB, så det behøver RE ikke at tjekke for.

Det er sikkert lige til, men føj jeg bliver aldrig god til regx :-)

..//Quercus
Avatar billede nielle Nybegynder
08. maj 2008 - 20:33 #1
Lad være med at forsøge at lave det i et tjek - det blover det ikke specielt pænt af:

if (preg_match("/[1-9]\d{2,6}/", $tal) && $tal != 112 && $tal !? 114)) {
    echo "Succes!";
}
Avatar billede nielle Nybegynder
08. maj 2008 - 20:34 #2
if (preg_match("/[1-9]\d{2,6}/", $tal) && $tal != 112 && $tal != 114)) {
Avatar billede quercus Nybegynder
09. maj 2008 - 12:38 #3
Nej, jeg syntes heller ikke det så pænt ud, det jeg forsøgte på :-)
Det her er jo simpelt!

Tak for svar! (dine point??)

Hvorfor {2,6}?
Mit tal må være på 3, 4, 5, 6 eller 7 cifre langt og jeg syntes at have lavet test med [1-9], men så kan mit tal ikke være 1500 og det må det gerne.
Jeg tester lige...
Avatar billede nielle Nybegynder
09. maj 2008 - 12:42 #4
Det første ciffer måtte jo ikke være 0:

[1-9]

Hvis der er ialt 3-7 cifre, så bliver det resterende antal jo 2-6:

\d{2,6}

Derfor! Det sidste led kune også skrives:

[0-9]{2,6}
Avatar billede erikjacobsen Ekspert
09. maj 2008 - 12:42 #5
112, 114?  Lyder som noget med telefonnumre. Kunne det ikke være smartere at sige det ikke må begynde med 112 og 114?
Avatar billede quercus Nybegynder
09. maj 2008 - 12:54 #6
Det er noget med telefonnumre :-)

Nummeret må ikke være på 2 cifre og det må heller ikke være på 8 cifre. Det må ikke starte med 0 og det må ikke være 112 og 114 og den slags 3 cifret reserveret numre. Så jo, man kan godt sige, at det må være på 3 cifre, bare ikke 112 og 114. Men det er jo også det du har sagt med det du har smidt mig nu. Men som jeg læser det, så kan man ikke lave et nummer der hedder 1500.

Eksempler på lovlige:
100, 101, 102... 111, 113, 115...
1480, 1481...
7114300, 7114301, 7114302...
Avatar billede erikjacobsen Ekspert
09. maj 2008 - 13:03 #7
Jeg tror ikke du forstår: hvis man ringer til (nu skal du ikke prøve): 11428937 så får man politiet. Derfor mit forslag til at nummeret ikke må starte med 112 eller 114.
Avatar billede quercus Nybegynder
09. maj 2008 - 13:04 #8
Det virker faktisk fint :-) ...dog kan jeg godt gemme:
123456789, eller 10203040 og det må man ikke...
Men kan jo så bare lægge maxlength="7" på mit <input>, kunne dog godt tænke mig at det blev håndteret i php...
Avatar billede erikjacobsen Ekspert
09. maj 2008 - 13:06 #9
Nielle mangler lige en ^ og $ - det kan han selv forklare ... ;)
Avatar billede quercus Nybegynder
09. maj 2008 - 13:09 #10
hmm... ja, joh...
Men det er noget med lokal numre... og man må faktisk godt have numre som:
1140, 1141, 1142....
Det kunne jo være at mit nummer var: 32601140 og dit var 32601141 osv....
Så jeg vil holde mig til 112 og 114 no-go! og det nu nævner, er uheldigt valgt...
Avatar billede quercus Nybegynder
09. maj 2008 - 13:11 #11
Og så er der en ) for meget... :-)

Så er det her vi lander?

if (preg_match("/^[1-9]\d{2,6}$/", $tal) && $tal != 112 && $tal != 114) {
Avatar billede erikjacobsen Ekspert
09. maj 2008 - 13:12 #12
Det bestemmer du helt selv. Men skal man kunne ringe til både 114 (politi) og 1140 (et lokalnummer), så formoder jeg at dit system selv kan skelne mellem dem. En almindelige gammeldags telefon med ledning i enden kan ikke.
Avatar billede quercus Nybegynder
09. maj 2008 - 13:41 #13
Det er noget lokal nummer på telefon central og den håndtere at man kan ringe til 114 og lokal nummer 1140. Vil blot forhindre bruger i at oprette eksempelvis 112 og 114 som lokal numre :-)

Jeg er lidt usikker på den med ^ og $, men det her ser ud til at virke:

if (preg_match("/[1-9]\d{2,6}/", $tal) && $tal != 112 && $tal != 114) {

Sammen med:

<input type="text" name="tal" id="tal" maxlength="7">
Avatar billede erikjacobsen Ekspert
09. maj 2008 - 13:49 #14
Den fra 13:11:13 er ellers rigtigere. Man kan altid snyde med maxlength, hvis man vil.
Avatar billede quercus Nybegynder
09. maj 2008 - 13:59 #15
Vi napper den fra 13:11:13 sammen med:
<input type="text" name="tal" id="tal" maxlength="7">

Så forstår brugeren jo nok, at han ikke skal hakke hverken 8 eller 9 tal ind... for det mås man ikke :-)

Tak for hjælpen!
Avatar billede nielle Nybegynder
09. maj 2008 - 16:32 #16
Hvorfor er du usikker på ^ og $? Du ramte ellers rigtig i første hug.
Avatar billede quercus Nybegynder
22. maj 2008 - 09:21 #17
^ betyder: skal starte med...
$ betyder: skal være i slutningen...

Ikke?

Som nævnt i starten.... jeg bliver aldrig helt god til det der regx. Forstå ikke helt det gennemløb der sker. Jeg er med på "starte med", men hvordan det skal læses i godt dansk forstår jeg ikke??

Hvis tallet starter med noget mellem 1 og 9 og ender op med at være mellem 3 og 7 cifre langt, så {

Ahh... det bliver langhåret at forklare tror jeg. Skal nok bare prøve det 100 gange mere, så er den der ;-)

Men det virker perfekt!
Avatar billede nielle Nybegynder
22. maj 2008 - 17:22 #18
> ^ betyder: skal starte med...
> $ betyder: skal være i slutningen...
>
> Ikke?

Ja.

F.eks. vil mønsteret:

^[a-z]

- matche på:

eksperten

- men det vil ikke matche på

123eksperten

Omvendt vil mønsteret:

[a-z]

- matche begge to:

eksperten
123eksperten

- fordi den bare leder efter et af bogstaverne a-z.

Princippet er det samme for $ - bare i den anden ende af strengen.


> Ahh... det bliver langhåret at forklare tror jeg. Skal nok bare prøve det 100 gange mere, så er den der ;-)

Hvis du gerne vil lære at forstå regexp, kan du f.eks. læse det to første af mine artikler om det:

http://www.eksperten.dk/artikler/1156
http://www.eksperten.dk/artikler/1157
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
Kurser inden for grundlæggende programmering

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