Regular expressions
-
- Posts: 9
- Joined: 4 January 2010, 01:13
Regular expressions
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
/^(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
-
- Posts: 180
- Joined: 2 September 2009, 09:31
Re: Regular expressions
Code: Select all
/^(https?|ftp):\/\/(\w+\.)+\w{2}(:\d{1,5})?(\/.*?)?$/
-
- Posts: 9
- Joined: 4 January 2010, 01:13
Re: Regular expressions
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...?
Kan man generalisera så att funktionen tar 2 eller 3 bokstäver efter punkten eller måste man specificera .se, .com, .net, .no osv...?
-
- Posts: 1474
- Joined: 29 August 2002, 15:19
Re: Regular expressions
Ändra tillmarcushjortsberg 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...?
/^(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
-
- Posts: 9
- Joined: 4 January 2010, 01:13
Re: Regular expressions
Danke shön!!
Det var detta jag ville ha
Bästa forumet än så länge!!
Snabba och riktiga svar!!

Det var detta jag ville ha

Bästa forumet än så länge!!
Snabba och riktiga svar!!





-
- Posts: 1474
- Joined: 29 August 2002, 15:19
Re: Regular expressions
Observera att jag ändrat vissa saker i texten.
-
- Posts: 9
- Joined: 4 January 2010, 01:13
Re: Regular expressions
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!
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.
-
- Posts: 1474
- Joined: 29 August 2002, 15:19
Re: Regular expressions
Adressen www.se är korrekt (och finns).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!
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
-
- Posts: 9
- Joined: 4 January 2010, 01:13
Re: Regular expressions
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!!
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!!
-
- Posts: 1474
- Joined: 29 August 2002, 15:19
Re: Regular expressions
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
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
-
- Posts: 180
- Joined: 2 September 2009, 09:31
Re: Regular expressions
När du specifikt ber om en regular expression där adressen ska sluta med två bokstäver så får du det.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...
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})?(\/.*)?/
-
- Posts: 1474
- Joined: 29 August 2002, 15:19
Re: Regular expressions
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.Fader_Berg wrote:När du specifikt ber om en regular expression där adressen ska sluta med två bokstäver så får du det.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...
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})?(\/.*)?/
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
-
- Posts: 180
- Joined: 2 September 2009, 09:31
Re: Regular expressions
Ahhh... Så är det ju, givetvis. Du har rätt.erik_persson wrote:Ovanstående matchar alltså tex: http://asd.asf.asdfjkhsadflkjhasdfl//&# ... ¤%asdf!"#¤!
Knasigt värre... Det gäller att hålla tungan rätt när man skriver RegExp:s.
-
- Posts: 9
- Joined: 4 January 2010, 01:13
Re: Regular expressions
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!
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!
-
- Posts: 180
- Joined: 2 September 2009, 09:31
Re: Regular expressions
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
eller
om även tre siffror efter slashen är tillåtet.
Code: Select all
/[a-zA-Z]{1,2}[0-9]{5}\/([0-9]{2}|[0-9]{4})/
Code: Select all
/[a-zA-Z]{1,2}[0-9]{5}\/[0-9]{2,4}/