← Back to team overview

sslug-teknik team mailing list archive

Re: Regexp spørgsmål

 

Asbjorn Grandt <asbjorn@xxxxxxxxxx> writes:

> Så jeg mangler en regexp expression der matcher "/.+?/../" men som
> undlader "/../../" og helst uden det første / hvis muligt. Men jeg har
> ingen anelse om hvordan det gøres.

Jeg er ikke helt klar over hvad det præcist er du vil, men har du set på
noget negative look-behind?

Det vil sige noget ala "(?<!/..)/../"?

Senere skriver du om normalisering af paths. Det kode jeg pljer at cargo
culte til den slags gør cirka sådan her:

    $path =~ s|/{2,}|/|g;                         # xx////xx  -> xx/xx
    $path =~ s!/[^/]+/\.\.(/|$)!/!g;              # xx/../yy/ -> yy/
    $path =~ s{(?:/\.)+(?:/|\z)}{/}g;             # xx/././xx -> xx/xx
    $path =~ s|^(?:\./)+||s unless $path eq "./"; # ./xx      -> xx
    $path =~ s|^/(?:\.\./)+|/|;                   # /../../xx -> xx
    $path =~ s|^/\.\.$|/|;                        # /..       -> /
    $path =~ s|/\z|| unless $path eq "/";         # xx/       -> xx

Men som alt andet cargo cultet kode så indeholder det en fejl. Regl 2
bør udføres indtil den ikke matcher længere.

Gad vide om det leder til sjove fejl i vores system...

//Makholm


Follow ups

References