Regular expressions

Fritt forum, här är det högt i taket.
Post Reply
marcushjortsberg
Posts: 9
Joined: 4 January 2010, 01:13

Regular expressions

Post by marcushjortsberg » 18 January 2010, 23:54

Håller på att göra en funktion dör en hemsideadress ska valideras och har kommit så här långt

/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(\.[A-Z][A-Z])(:(\d+))?\/?$/i

denna funktion ger att man måste skriva

http://minsida.minsida.se

eller

http://minsida.minsida.minsida.se

alltså, adressen måste avslutas med två bokstäver...

Det jag vill är att användaren ska kunna skriva t.ex

http://minsida.se eller com osv...
http://minsida.minsida.se eller com osv...
http://minsida.minsida.minsida.se eller com osv...
http://minsida.se/minsida eller com osv...
http://minsida.minsida.se/minsida eller com osv...
http://minsida.minsida.minsida.se/minsida eller com osv...
http://www.minsida.se eller com osv...
http://www.minsida.minsida.se eller com osv...
http://www.minsida.minsida.minsida.se eller com osv...

och så vidare...

Tack på förhand

Fader_Berg
Posts: 180
Joined: 2 September 2009, 09:31

Re: Regular expressions

Post by Fader_Berg » 19 January 2010, 09:40

Code: Select all

/^(https?|ftp):\/\/(\w+\.)+\w{2}(:\d{1,5})?(\/.*?)?$/

marcushjortsberg
Posts: 9
Joined: 4 January 2010, 01:13

Re: Regular expressions

Post by marcushjortsberg » 19 January 2010, 22:49

Den funkar som jag vill förutom att den inte tar .com eller annat som har fler än två bokstäver efter punkten...

Kan man generalisera så att funktionen tar 2 eller 3 bokstäver efter punkten eller måste man specificera .se, .com, .net, .no osv...?

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Re: Regular expressions

Post by erik_persson » 19 January 2010, 22:51

marcushjortsberg wrote:Den funkar som jag vill förutom att den inte tar .com eller annat som har fler än två bokstäver efter punkten...

Kan man generalisera så att funktionen tar 2 eller 3 bokstäver efter punkten eller måste man specificera .se, .com, .net, .no osv...?
Ändra till
/^(https?|ftp):\/\/(\w+\.)+\w{2,4}(:\d{1,5})?(\/.*?)?$/

4 för att matcha även mot domäner som .info

Den funkar alltså på följade sätt:
(http möjligen med ett s på slutet, eller ftp) följt av kolon och två /, sedan följt av minst en sekvens bestående av minst ett icke whitespace-tecken följt av punkt.
Därefter 2 till 4 icke whitespace-tecken. Efter detta kommer, möjligen, ett kolon följd av 1 till 5 siffror.
Därefter kommer, möjligen, ett / följt av vilka tecken som helst. och sedan är det slut.

Du kan utelämna det näst sista ?. Jag kan inte se att det gör någon nytta och det skulle kunna göra uttrycket något långsammare.

Dessutom så bör det pillas in \.? efter \w{2,4} eftersom domännamn *egentligen* alltid slutar på ".".
Det skulle ge
/^(https?|ftp):\/\/(\w+\.)+\w{2,4}\.?(:\d{1,5})?(\/.*)?$/

Du ska också vara medveten om att toppdomänsystemet har förändrats. I framtiden så ska det gå att registrera toppdomäner för den som så vill, och då kommer det kanske att vara fler än 4 tecken in toppdomännamnet. (I ärlighetens namn så har jag inte sett hur detta är specat och om det finns någon övre begränsning på hur många tecken toppdomänerna får ha - någon annan?)

/ep

marcushjortsberg
Posts: 9
Joined: 4 January 2010, 01:13

Re: Regular expressions

Post by marcushjortsberg » 19 January 2010, 22:58

Danke shön!!

Det var detta jag ville ha :D

Bästa forumet än så länge!!

Snabba och riktiga svar!!

:D :D :D :D :D

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Re: Regular expressions

Post by erik_persson » 19 January 2010, 23:03

Observera att jag ändrat vissa saker i texten.

marcushjortsberg
Posts: 9
Joined: 4 January 2010, 01:13

Re: Regular expressions

Post by marcushjortsberg » 19 January 2010, 23:04

Ohhh, by the way!

Kan man med regular expressions göra en if-sats som gör att om någon anger www så måste det följas av .minsida.se??

alltså

http://minsida.se eller http://minsida.minsida.se eller http://www.minsida.se eller http://www.minsida.minsida.se

men inte

http://www.se

??

Man lär så länge man lever!
Last edited by marcushjortsberg on 19 January 2010, 23:21, edited 1 time in total.

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Re: Regular expressions

Post by erik_persson » 19 January 2010, 23:19

marcushjortsberg wrote:Ohhh, by the way!

Kan man med regular expressions göra en if-sats som gör att om någon anger www så måste det följas av .minsida.se??

alltså

http://minsida.se eller http://www.minsida.se

men inte

http://www.se

??

Man lär så länge man lever!
Adressen www.se är korrekt (och finns).

Det går för övrigt bra med:
/^(https?|ftp):\/\/(\w+\.)+\w{2,4}\.?(:\d{1,5})?(\/|$)/

Hur som helst finns ett problem med uttrycket. "-" får finnas i domännamn, men godtas inte av uttrycket ovan. Pilla in det.

/ep

marcushjortsberg
Posts: 9
Joined: 4 January 2010, 01:13

Re: Regular expressions

Post by marcushjortsberg » 19 January 2010, 23:26

Ok. Tackar för förtydligandet!

Ursäkta att jag ändrade mina önskningar!!

Jag brukar säga "Assumption is the mother of all fuckups"...det var det jag just gjorde med www.se....

Tackar igen!!

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Re: Regular expressions

Post by erik_persson » 19 January 2010, 23:30

Ett domännamn får alltså innehålla "-", men får inte *börja* eller sluta med "-", och får inte innehålla "_".
Uttrycket nedan tillåter *inte* "-" (problem) men tillåter "_" (inte något större problem).

/^(https?|ftp):\/\/(\w+\.)+\w{2,4}\.?(:\d{1,5})?(\/|$)/

Alternativn (som tillåter "-"):
/^(https?|ftp):\/\/([-\w]+\.)+[-\w]{2,4}\.?(:\d{1,5})?(\/|$)/

Här bryr jag mig inte om regeln att domännamnet inte för böjar eller sluta med "-".

/ep

Fader_Berg
Posts: 180
Joined: 2 September 2009, 09:31

Re: Regular expressions

Post by Fader_Berg » 20 January 2010, 01:08

marcushjortsberg wrote:Den funkar som jag vill förutom att den inte tar .com eller annat som har fler än två bokstäver efter punkten...
När du specifikt ber om en regular expression där adressen ska sluta med två bokstäver så får du det.

För att komplettera ovan, så kanske du vill ändra slutet för att få med eventuell text efter slash... och ta bort sökningen för punkt efter det kompletta domännamnet. Kan ju kosta, tydligen... :)

Code: Select all

/^(https?|ftp):\/\/([-\w]+\.)+[-\w]{2,4}(:\d{1,5})?(\/.*)?/

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Re: Regular expressions

Post by erik_persson » 21 January 2010, 00:39

Fader_Berg wrote:
marcushjortsberg wrote:Den funkar som jag vill förutom att den inte tar .com eller annat som har fler än två bokstäver efter punkten...
När du specifikt ber om en regular expression där adressen ska sluta med två bokstäver så får du det.

För att komplettera ovan, så kanske du vill ändra slutet för att få med eventuell text efter slash... och ta bort sökningen för punkt efter det kompletta domännamnet. Kan ju kosta, tydligen... :)

Code: Select all

/^(https?|ftp):\/\/([-\w]+\.)+[-\w]{2,4}(:\d{1,5})?(\/.*)?/
Jag tänkte ett tag på något liknande ovan när jag tittade på din första regexp, men kom fram till att det nog inte är ok.
Eftersom det finns ? efter såväl port-siffror som efter \/.* och uttrycket inte är förankrat i slutet, så betyder det att såväl portsiffrorna som det som är efter dessa är överflödigt.
Matchar uttrycket fram till (men inte med) portsiffrorna så matchar hela uttrycket, oavsett vad som kommer efteråt.
Det gör också 4:an i toppdomänsmatchningsdelen överflödig.
Ovanstående matchar alltså tex: http://asd.asf.asdfjkhsadflkjhasdfl//&# ... ¤%asdf!"#¤!
bara för att ta ett exempel :-)

Jag tänkte inte på det problemet förrän jag såg din ursprungliga regexp. Sedan ändrade jag efter samma princip till (\/|$) i slutet.

Punkten efter domännamnet tror jag i princip är nödvändig. Ett domännamn innehåller *egentligen* en punkt sist och ett sådant domännamn är korrekt (se tex vad som erhålls från dig). "." motsvarar roten i domänsystemet. Det viktiga är väl att alla korrekta url:er tillåts, men att åtminstone en del av de felatkiga sorteras bort.
Våra regexpar tillåter tex "_" och att namnen såväl slutar som börjar med "-".
/ep

Fader_Berg
Posts: 180
Joined: 2 September 2009, 09:31

Re: Regular expressions

Post by Fader_Berg » 21 January 2010, 07:52

erik_persson wrote:Ovanstående matchar alltså tex: http://asd.asf.asdfjkhsadflkjhasdfl//&# ... ¤%asdf!"#¤!
Ahhh... Så är det ju, givetvis. Du har rätt.
Knasigt värre... Det gäller att hålla tungan rätt när man skriver RegExp:s.

marcushjortsberg
Posts: 9
Joined: 4 January 2010, 01:13

Re: Regular expressions

Post by marcushjortsberg » 21 January 2010, 16:40

Tack för alla svar!

Jag har lärt mig mycket om detta enbart genom denna tråd!

Den sista funktionen jag gjorde ser ut så här

/^([a-zA-Z]{1}|[a-zA-Z]{2})([0-9]{5})\/([0-9]{2}|[0-9]{4})$/i

och ger att användaren kan lämna

en eller två bokstäver, fem siffror, /, två eller fyra siffror

t.ex SE12345/11

Jag hade mycket problem till en början...hade lagt in + lite här och där och fattade inte varför t.ex man kunde skriva hur många siffror som helst där jag hade tänkt bara fem siffror.....

I mitt huvud är + att lägg till nästa "grej"...men här betyder det ju lägg till en eller flera av föregående "grej"...

Åter igen "Assumption is the mother of all fuckups"....

Tack än en gång!

Fader_Berg
Posts: 180
Joined: 2 September 2009, 09:31

Re: Regular expressions

Post by Fader_Berg » 21 January 2010, 17:32

I klammerparenteserna kan du ange omfång av ett antal också, (d.v.s. {1, 4} = ett till fyra). Inte bara ett bestämt antal. Så din RegExp kan förkortas till

Code: Select all

/[a-zA-Z]{1,2}[0-9]{5}\/([0-9]{2}|[0-9]{4})/
eller

Code: Select all

/[a-zA-Z]{1,2}[0-9]{5}\/[0-9]{2,4}/
om även tre siffror efter slashen är tillåtet.

Post Reply