/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
RegExp: Mønster der matcher en URI
Fra : Jesper Stocholm


Dato : 14-08-03 14:28

Jeg sidder og er ved at skrive et RegExp til at matche en URI. Kravene
til det er at det skal kunne håndtere http(s) og ftp-adresser samt
underfoldere og filer. Det skal udskifte alle forekomster hvor et
match forekommer.

Indtil videre har jeg lavet

re = new RegExp('([http|https|ftp](://))?([\w]+)([\.\w+]+)[^\w]*');
str = document.forms[0].Phone.value; //textarea med lang tekst
newstr = str.replace(re, '<a href="$1">$1</a>');
document.write(newstr)

Men hvis jeg fx fodrer den med

"Mit website http://www.stocholm.dk/about.aspx er ikke nede",

Så returnerer den

Mit website htt<a href="p://">p://</a>stocholm.dk/about.aspx er ikke
nede.

Er der nogle af jer, der kan se hvor det går galt henne?


--
Jesper Stocholm
http://stocholm.dk

 
 
Lasse Reichstein Nie~ (14-08-2003)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 14-08-03 14:49

nospamgoogle@stocholm.dk (Jesper Stocholm) writes:

> Jeg sidder og er ved at skrive et RegExp til at matche en URI. Kravene
> til det er at det skal kunne håndtere http(s) og ftp-adresser samt
> underfoldere og filer. Det skal udskifte alle forekomster hvor et
> match forekommer.
>
> Indtil videre har jeg lavet
>
> re = new RegExp('([http|https|ftp](://))?([\w]+)([\.\w+]+)[^\w]*');

> Er der nogle af jer, der kan se hvor det går galt henne?

De firkantede parenteser bruges til at matche enkelte tegn. Altså
/[http|https|ftp]/ matcher det samme som /[htp|sf]/, det hjælper
ikke at gentage et tegn, og "|" er ikke magisk mellem [ og ].

Du bruger $1 til at referere til den første match. Det er den hvis
parenteser starter først, altså: ([http|https|ftp](://)), som netop
matcher "p://".

Du mener måske:
re = /(((http|https|ftp):\/\/)?\w+[.\w]+[^\w]*)/
Der er parentes omkring det hele, fordi så er $1 hele det matchede
stykke. Der er ikke flere firkantede parenteser end nødvendigt :)

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
Art D'HTML: <URL:http://www.infimum.dk/HTML/randomArtSplit.html>
'Faith without judgement merely degrades the spirit divine.'

Jesper Stocholm (14-08-2003)
Kommentar
Fra : Jesper Stocholm


Dato : 14-08-03 15:27

Lasse Reichstein Nielsen wrote in dk.edb.internet.webdesign.clientside:
> nospamgoogle@stocholm.dk (Jesper Stocholm) writes:
>
> > Jeg sidder og er ved at skrive et RegExp til at matche en URI. Kravene
> > til det er at det skal kunne håndtere http(s) og ftp-adresser samt
> > underfoldere og filer. Det skal udskifte alle forekomster hvor et
> > match forekommer.
> >
> > Indtil videre har jeg lavet
> >
> > re = new RegExp('([httphttpsftp](://))?([\w]+)([\.\w+]+)[^\w]*');
>
> > Er der nogle af jer, der kan se hvor det går galt henne?
>
> De firkantede parenteser bruges til at matche enkelte tegn. Altså
> /[http|https|ftp]/ matcher det samme som /[htp|sf]/, det hjælper
> ikke at gentage et tegn, og "" er ikke magisk mellem [ og ].

OK :)

> Du bruger $1 til at referere til den første match. Det er den hvis
> parenteser starter først, altså: ([httphttpsftp](://)), som netop
> matcher "p://".
>
> Du mener måske:
> re = /(((http|https|ftp):\/\/)?\w+[.\w]+[^\w]*)/

Det hjalp i hvert fald lidt ad vejen ...

Resultatet af replace ser dog stadig lidt mystisk ud. Det ser ud til at den
mangler at kigge på whitespace før URI og whitespace efter URI.

Jeg har lagt det eksempel jeg sidder og arbejder med op på
www.stocholm.dk/test/html/replace.html, hvor resultatet kan ses. Hvis jeg
kigger på
http://devedge.netscape.com/library/manuals/2000/javascript/1.4/guide/regex
p.html, så skal jeg også teste for forekomst af \s, men de resultater jeg
får når jeg indsætte dem giver ikke rigtigt mening.

Umiddelbart vil jeg tro det skulle ændres til
re = new RegExp('(((http|https|ftp):\/\/)?\w+[.\w]+([^\w]*[\s]+))');
---------------------------------------------------^------^^^^^^----

Men det giver ikke det ønskede resultat.

Tak for din hjælp indtil nu.



/Jesper

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Torben Brandt (14-08-2003)
Kommentar
Fra : Torben Brandt


Dato : 14-08-03 23:24

Jesper Stocholm wrote:
> Lasse Reichstein Nielsen wrote:
>>>
>>>Jeg sidder og er ved at skrive et RegExp til at matche en URI. Kravene
>>>til det er at det skal kunne håndtere http(s) og ftp-adresser samt
>>>underfoldere og filer. Det skal udskifte alle forekomster hvor et
>>>match forekommer.
>>>
>>Du mener måske:
>> re = /(((http|https|ftp):\/\/)?\w+[.\w]+[^\w]*)/
>
> Det hjalp i hvert fald lidt ad vejen ...
>
> Resultatet af replace ser dog stadig lidt mystisk ud. Det ser ud til at den
> mangler at kigge på whitespace før URI og whitespace efter URI.
>
> Jeg har lagt det eksempel jeg sidder og arbejder med op på
> www.stocholm.dk/test/html/replace.html, hvor resultatet kan ses.

Filen hedder nu regexp.html
<URL:http://www.stocholm.dk/test/html/regexp.html>

> Umiddelbart vil jeg tro det skulle ændres til
> re = new RegExp('(((http|https|ftp):\/\/)?\w+[.\w]+([^\w]*[\s]+))');
> ---------------------------------------------------^------^^^^^^----

Der er forskel på at angive mønstret mellem /'er og som streng. Lasse
bruger /'er, så du skal huske at lave alle backslashes til
dobbelt-backslashes når du skriver det som streng. Måske er det grunden
til de lidt mærkelige resultater det giver :)

Jeg ville foreslå denne:
[Beklager at linierne er for lange til ikke at blive ombrudt, men kopier
det over i en notepad]
re = new
RegExp(/(((http|https|ftp):\/\/)?[\wæøåÆØÅ\.\-]+\.[A-Za-z]{1,5}(\/[\w\.\/\-]*(\?\S*)?)?)/g);
// Protokol -----^^^^^^^^^^^^^^^^^^^^^^^^^
// Domæne --------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// muligvis noget efter domænet
----------------------------------------^----------------------^^
// mulige undermapper og filnavn (indledes med / hvis der er noget)
-----^^^^^^^^^^^^^
// mulig querystring (indledes med ? hvis der er noget)
------------------------------^^^^^^^^^

Jeg tillader æøå i domæner (ikke TLD) og TLD kan være fra 1 til 5
bogstaver. Bemærk også at der kan være bindestreg og punktum i domænet,
og \w matcher ikke disse to tegn.

Det sværeste ved ovenstående er at finde ud af hvornår man skal slutte,
for ofte skrives querystringen ikke urlencoded (escape() i javascript)
og kan derfor indeholde alle tegn. Jeg har sagt at første gang man
kommer til tegnene i \s så stopper vi, det er primært mellemrum,
linieskift og tabulatorer

Bemærk også at jeg angiver et g efter /...../, det angiver global
søgning, dvs man skal finde alle matches og ikke bare det første.

mvh Torben


Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste