Avatar billede lklingenberg Nybegynder
06. maj 2004 - 23:14 Der er 36 kommentarer og
3 løsninger

URL tjek med regular expression

Hi E,

Jeg har længe kigget efter et reg exp udtryk, som kunne validere en URL. Det har ikke været nemt, så jeg prøver nu at sætte noget sammen, men vil meget gerne have lidt hjælp, da jeg ikke er den største haj til reg exp (endnu ;-).

Jeg har forsøgt at opdele udtrykket i de enkelte bestanddele:

Protokol:
(http|https|ftp)\:\/\/

Domæne (ikke IP-nummer):
\w+([\.\-]\w+)*\.\[A-Za-z]{2,6}

IP-nummer (modificeret fra http://www.regexlib.com):
25[0-5]|2[0-4]\n|1\n\n|[1-9]\n|\n)\.){3}(25[0-5]|2[0-4]\n|1\n\n|[1-9]\n|\n

Typer af 'endelser':
(\:\d+)*
(\/\~?\w+)*
\/?
(\/\w+\.\w{2,5})?
([\+\.\,\-\?\&\%\#\=\$]\w+)*

Det samlede udtryk bliver så på formen:
/^protokol(domæne|IPnummer)endelser$/i

Er der nogen af de skarpe reg exp hoveder der kan gennemskue om jeg har fået det hele med, om det kan gøres mere elegant eller om der er decideret fejl i udtrykket. Der gives point til alle, der efter min mening forbedrer udtrykket (eller har et helt andet og bedre alternativ).
Avatar billede lklingenberg Nybegynder
06. maj 2004 - 23:58 #1
Jeg har da i hvert fald fundet en fejl:
\w+([\.\-]\w+)*\.\[A-Za-z]{2,6}
skal være
\w+([\.\-]\w+)*\.[A-Za-z]{2,6}
Avatar billede roenving Novice
07. maj 2004 - 01:02 #2
Cifre hedder \d (digit) og ikke \n (som er nylinje !-)

-- og så må man jo idag bruge alle mulige tegn, så jeg bruger denne som matrix (her i javascript !-)

  var t = "\\wáàãââæåçéèêëìíîïñòóôõöøùúûüýÿ";
  var regexp = new RegExp("^["+t+"]["+t+"\\.\\-]*@["+t+"]["+t+"\\.\\-]*\\.["+t+"]{2}["+t+"\\.\\-\\/]*$","i");
Avatar billede roenving Novice
07. maj 2004 - 01:03 #3
Hov, det var den, jeg bruger til mail-adresser, men du kan jo plukke ...
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 01:04 #4
\d vs. \n: Ups! Man skal passe på med 'search and replace' :-)
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 01:11 #5
Kan du forklare mig betydningen af \\

Og mht. brugen af specielle tegn, er det vel blot et spm om at erstatte \w med din t-var på udvalgte steder.
Avatar billede roenving Novice
07. maj 2004 - 01:18 #6
\\er fordi du skal følge streng-regler, når man opstiller en regExp med new RegExp, så en enkelt \ vil være en escape af det næste tegn, før det sendes videre til fortolkning ...

Da \w er et speciel-tegn, som skal sendes sådan til regExp'en, skal vi altså escape \-tegnet, derfor to ...

Og jepz, det var ideen i at vise den !-)
Avatar billede roenving Novice
07. maj 2004 - 02:01 #7
-- og uff, det bliver da en motherfucker:

var t = "\\wáàãââæåçéèêëìíîïñòóôõöøùúûüýÿ";
var urlReg = new RegExp("^(http|https|ftp)\\:\\/\\/([" + t + "]+([\\.\\-][" + t + "]+)*\\.[A-Za-z]{2,6}|(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.{3}(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))((\\:\\d+)*|(\\/\\~?[" + t + "]+)*|\\/?|(\\/[" + t + "]+\\.[" + t + "]{2,5})?|([\\+\\.\\,\\-\\?\\&\\%\\#\\=\\$][" + t + "]+)*)");
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 03:26 #8
Ja, det skal jeg godt nok love for!
btw. URL'en http://domain.dk/?param=value bliver ikke godkendt af udtrykket, så en tilføjelse er vis på sin plads. Desuden har jeg fundet et par andre fejl, så jeg bakser nok videre på den 'i morgen'.
Avatar billede roenving Novice
07. maj 2004 - 03:45 #9
Efter at have brugt mere end en ½ time på at debugge bare oprettelsen af regexp'en, nåede jeg ikke så meget mere, så jeg testede kun lige en indlysende tavetosse ...

-- og det så jeg lige: $-tegnet mangler i slutningen !-)

-- iøvrigt kan man gøre den simplere at debugge, ved ikke at bruge t-variablen, men indsætte ækvivalenten direkte alle 6 gange, men den bliver ik' li'e kortere af det !o]
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 04:42 #10
Så tror jeg, jeg er kommet et par skridt nærmere. Jeg har dog (endnu) ikke implementeret de specielle tegn, men det kan man jo enten gøre på den ene eller den anden måde, som du skriver roenving.

Protokol:
(http|https|ftp)\:\/\/

Domæne:
\w+([\.\-]\w+)*\.[A-Za-z]{2,6}

IP-nummer:
((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)

'Resten':
(\:\d+)?(\/\~?\w+)*((\/|\/\w+\.\w{2,5})?((\?\w+\=[\+\.\,\-\?\&\%\#\=\$\w]*)?))

Samlet bliver det (hold fast):
/^(http|https|ftp)\:\/\/((\w+([\.\-]\w+)*\.[A-Za-z]{2,6})|(((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)))(\:\d+)?(\/\~?\w+)*((\/|\/\w+\.\w{2,5})?((\?\w+\=[\+\.\,\-\?\&\%\#\=\$\w]*)?))$/i
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 04:45 #11
(Der kan vist rydes et par parenteser om QueryString-udtrykket)
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 04:51 #12
Og så kan der vel også være bindestreger i foldernavne:
(\/\~?[\-\w]+)*
i stedet for
(\/\~?\w+)*
Avatar billede roenving Novice
07. maj 2004 - 05:15 #13
Ikke en fejl, men bare en minimal rationalisering:

[A-Za-z] --> [a-z], når du alligevel bruger /i

Hvad er iøvrigt ideen i: (\/\w+\.\w{2,5})?

Hvis det er et filnavn, som umiddelbart er det eneste som giver mening for mig, kan der vel være andre, som f.eks. escapede karakterer ?-)
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 06:14 #14
Ja, (\/\w+\.\w{2,5})? refererer til et filnavn, og du har ret i, at der kan forekommer andre tegn i filnavnet også - jeg tror jeg mest har tænkt på index.htm og lign. filer, da jeg lavede den del af udtrykket, men det er jo for begrænset. Måske er dette bedre (kunne kun lige komme i tanke om bindestregen - er der andre karakterer der ville kunne optræde i et filnavn?):
(\/[\-\w]+\.\w{2,5})?
Avatar billede roenving Novice
07. maj 2004 - 06:30 #15
Et escaped mellemrum: %20 ?-)
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 06:36 #16
Tjoe - fx i en URL til et pdf dokument. Du godeste, så er der jo mange muligheder. Argh.
Men men, hvis man snakker om en URL til en internetside (og ikke en fil, der skal åbnes med en ekstern applikation) er det vel kun [\-\w]+ som er relevant, eller?
Avatar billede roenving Novice
07. maj 2004 - 06:39 #17
Desværre nej, for hvis dit grundlag er en Microsoft-server vil den acceptere fil-navne, som overholder filsystemets begrænsninger ...

-- og ja, argh, der er et shitload af mærkværdige muligheder, dog begrænset til %-tegnet efterfulgt af hexadecimale cifre !-)
Avatar billede roenving Novice
07. maj 2004 - 06:45 #18
-- og har du deep nestede filnavne med ?-)

domæne.dk/karls/internet/underside.smartstyle/fancy.shtmlx

-- både en iis og f.eks. apache kan du jo softkonfigurere til at acceptere sådan noget som andre fil-endelser !-)
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 08:29 #19
Deep nestede filnavn er med ( (\/\~?[\-\w]+)* efterfulgt af ((\/|\/\w+\.\w{2,5})?...) ). Extension kan være på 2-5 tegn, men en .shtmlx fil ville ikke gå igennem, men det er jo blot et spm om at sætte {2,5} til {2,6} - eller mere hvis det er nødvendigt.

...og så må jeg jo heller inkludere %... muligheden i udtrykket også - og det kan jo så i princippet både være i foldernavn og filnavn (selvom det ville være en noget uhensigtsmæssigt URL) :-/
Avatar billede olebole Juniormester
07. maj 2004 - 13:45 #20
<ole>

Mellemrum i folder- og/eller filnavne ses desværre forbløffende ofte, så '%' er et absolut must  :)

/mvh
</bole>
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 16:43 #21
Så bliver 'resten' således:
(\:\d+)?(\/\~?[\%\w]+)*((\/|\/[\%\w]+\.\w{2,6})?((\?\w+\=[\+\.\,\-\?\&\%\#\=\$\w]*)?))

Puha, det bliver lidt langhåret det her. Er vi måske ved at være der...
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 16:44 #22
...stadig under forudsætning af at \w (på den ene eller den anden måde) skal erstattes af roenvings t-var (07/05-2004 02:01:14).
Avatar billede roenving Novice
07. maj 2004 - 16:49 #23
Tjah, man kan jo indvende, at det ikke er sandsynligt, at %-tegn forekommer efter hinanden, så i stedet for \% burde man måske bruge \%[\da-f]{2} ...

-- men så er vi også ude der, hvor man kan sidde på håret !-)
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 20:07 #24
Yaiks! Nu bli'r det langhåret (og jeg er ved at miste overblikket...
Bliver det så ikke noget i retningen af [(\%[\da-f]{2})\w]+
Et mellemrum kunne jo godt risikere at optræde flere gange i et fil- eller foldernavn.
Avatar billede roenving Novice
07. maj 2004 - 20:18 #25
Det både ser og lyder rigtigt (ud) ...
Avatar billede olebole Juniormester
07. maj 2004 - 22:29 #26
Husk kolon også kan forekomme  :)
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 22:37 #27
->olebole:
Kolon? Som fx i http://domain.dk:8080/ - den er med i udtrykket (\:\d+)?
Eller tænker du på udtrykket, der tjekker en evt. querystring?
Avatar billede olebole Juniormester
07. maj 2004 - 22:43 #28
Avatar billede olebole Juniormester
07. maj 2004 - 22:45 #29
I query-strengen kan jo faktisk stå det samme som i resten  :)
Avatar billede lklingenberg Nybegynder
07. maj 2004 - 23:05 #30
Ja, den med querystringen skal lige udvides lidt - det har du ret i.
Noget i retningen af:
(\?\w+\=[\/\+\.\,\:\;\-\?\&\%\#\=\$\w]*)?
eller kunne man i virkeligheden bare skrive:
(\?[\W\w]+\=[\W\w]*)?
Avatar billede roenving Novice
07. maj 2004 - 23:08 #31
[\W\w] skrives . !-)
Avatar billede olebole Juniormester
08. maj 2004 - 01:38 #32
Det er ved at være noget af en mother ... men det er zq da altid noget, man ikke skal udtale det ...!  :)
Avatar billede roenving Novice
08. maj 2004 - 01:42 #33
Hvordan forbinder man en forstuvet tunge *lol*
Avatar billede lklingenberg Nybegynder
17. maj 2004 - 15:22 #34
Jeg har ikke glemt jer... Vender tilbage snarest!
Kan I ikke i mellemtiden begge give et svar, så pointuddelingen kan ske umiddelbart efter spm er lukket.
Avatar billede roenving Novice
17. maj 2004 - 15:23 #35
Oki '-)
Avatar billede olebole Juniormester
17. maj 2004 - 16:59 #36
Kun lidt 'krummer' til mig, tak. Jeg er jo som sædvanligt ikke stået til søs, men har ladt de andre stå ... og så kæftet lidt op fra sidelinien  ;D
/mvh
Avatar billede lklingenberg Nybegynder
06. august 2004 - 08:49 #37
Kære roenving og olebole, jeg har ikke haft computer med internetadgang i nogle (!) måneder, så jeg har selvsagt ikke været på eksperten i en rum tid - jeg beklager, at dette spm har hængt, men jeg vil så afslutte det nu.
Avatar billede lklingenberg Nybegynder
06. august 2004 - 08:53 #38
Håber pointtildelingen er tilfredsstillende...
Avatar billede roenving Novice
06. august 2004 - 15:19 #39
-- jo, tak for point ;~}
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