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

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Hjælp til regex
Fra : Mikkel Z. Herold


Dato : 07-05-08 13:50

Endnu engang sidder jeg og roder med et regex, som jeg ikke kan få til
at virke:

Jeg vil gerne have den til at lave en sti som denne
"/mappe/billede10.png" om til
"/shared/show_image.html?src=/mappe/billede.png&width=10"

Til det formål har jeg lavet dette regex, som virker:

ereg_replace("^([a-z_\/\._]*)([0-9]*)([a-z\.]*)$",
"/shared/show_image.html?src=/\\1\\3&width=\\2", $string)

Så langt så godt, men nu vil jeg gerne kunne tilføje en valgfri
parameter, hvis og kun hvis den oprindelige sti har et "f" efter
billednummeret, altså hvis stien hedder f.eks. "/mappe/billede10f.png",
så skal der sættes en ekstra parameter på den omformede sti, så den
kommer til at hedde
"/shared/show_image.html?src=mappe/billede.png&width=10&fixed_size=yes"

Og det er her, det går galt. Det er ikke noget problem at tjekke, om der
er et "f" - det gør jeg med ^([a-z_\/\._]*)([0-9]*)(f)?([a-z\.]*)$ - men
hvordan får jeg det f omformet til strengen "&fixed_size=yes" i den nye
streng, og vel at mærke kun, når der er et f - ellers skal der ikke
sættes noget ind.

Det bliver altid noget rodet, når man skal forklare sine regexp's, men
jeg håber, det giver mening!

Mvh. Mikkel


--
"At first just a rustle of canvas
And the gentlest breath on my face"
Sting, "The Wild Wild Sea"

 
 
Peter Brodersen (07-05-2008)
Kommentar
Fra : Peter Brodersen


Dato : 07-05-08 15:28

On Wed, 07 May 2008 14:50:07 +0200, "Mikkel Z. Herold"
<mikkel@[remove_this]mzh.dk> wrote:

>ereg_replace("^([a-z_\/\._]*)([0-9]*)([a-z\.]*)$",
>"/shared/show_image.html?src=/\\1\\3&width=\\2", $string)
>
>Så langt så godt, men nu vil jeg gerne kunne tilføje en valgfri
>parameter, hvis og kun hvis den oprindelige sti har et "f" efter
>billednummeret, altså hvis stien hedder f.eks. "/mappe/billede10f.png",
>så skal der sættes en ekstra parameter på den omformede sti, så den
>kommer til at hedde
>"/shared/show_image.html?src=mappe/billede.png&width=10&fixed_size=yes"
>
>Og det er her, det går galt. Det er ikke noget problem at tjekke, om der
>er et "f" - det gør jeg med ^([a-z_\/\._]*)([0-9]*)(f)?([a-z\.]*)$ - men
>hvordan får jeg det f omformet til strengen "&fixed_size=yes" i den nye
>streng, og vel at mærke kun, når der er et f - ellers skal der ikke
>sættes noget ind.

Hvis du har en god del omstændigheder, du gerne vil tage højde for, kan du
eventuelt gøre det i to led og starte med en ereg (eller preg_match) og så
i ro og mag med et par if-strukturer danne den url, du ønsker.

Og så slutte med en almindelig søg og erstat.

Altså, ret din ereg_replace til if (ereg(..)) og skab så din url ved at
tjekke de matchede værdier.

Hvis du kun vil lave ét match, kan du bruge preg_replace og /e-flaget, og
så have en funktion til at danne url'en.

--
- Peter Brodersen
Kendt fra Internet

Mikkel Z. Herold (07-05-2008)
Kommentar
Fra : Mikkel Z. Herold


Dato : 07-05-08 22:00

On 07-05-2008 16:28 Peter Brodersen wrote:
> Hvis du har en god del omstændigheder, du gerne vil tage højde for, kan du
> eventuelt gøre det i to led og starte med en ereg (eller preg_match) og så
> i ro og mag med et par if-strukturer danne den url, du ønsker.

Ja, men problemet er bare, at jeg skal have det smidt i en htaccess-fil
i forbindelse med noget url rewrite, så jeg kan vist ikke rigtig splitte
det op.

Så vidt jeg har kunnet læse mig til, er der noget der hedder conditional
regex'er - er der nogen, der har erfaring med det?

Mvh. Mikkel

--
"At first just a rustle of canvas
And the gentlest breath on my face"
Sting, "The Wild Wild Sea"

Martin (07-05-2008)
Kommentar
Fra : Martin


Dato : 07-05-08 22:29

Mikkel Z. Herold wrote:
> On 07-05-2008 16:28 Peter Brodersen wrote:
>> Hvis du har en god del omstændigheder, du gerne vil tage højde for,
>> kan du
>> eventuelt gøre det i to led og starte med en ereg (eller preg_match)
>> og så
>> i ro og mag med et par if-strukturer danne den url, du ønsker.
>
> Ja, men problemet er bare, at jeg skal have det smidt i en htaccess-fil
> i forbindelse med noget url rewrite, så jeg kan vist ikke rigtig splitte
> det op.
>
> Så vidt jeg har kunnet læse mig til, er der noget der hedder conditional
> regex'er - er der nogen, der har erfaring med det?

Jeps - har dog ikke lige nogle eksempler liggende (ligger på en kundes
ftp, og den har jeg ikke lige adgang til PT)

Anyway, så hedder det RedirectMatch - altså redirect hvis det matcher,
og hvis ikke så fortsætter den til næste RedirectMatch.

Der er vist også noget med nogle flags man kan sætte i enden L mener jeg
det er, også kan man bruge RewriteRule .... [L]

Men jeg ville nok hoppe over i Apache gruppen, hvis du vil have
yderligere hjælp til htaccess - derovre ved de en HELT masse - men
dokumentationen(1) er altså heller ikke så ringe endda

1) <http://httpd.apache.org/docs/2.0/howto/htaccess.html>

Martin (07-05-2008)
Kommentar
Fra : Martin


Dato : 07-05-08 22:29
Mikkel Z. Herold (07-05-2008)
Kommentar
Fra : Mikkel Z. Herold


Dato : 07-05-08 22:37

On 07-05-2008 23:29 Martin wrote:
> Burde selvfølgelig være
> <http://httpd.apache.org/docs/2.0/misc/rewriteguide.html>

Takker - det vil jeg tjekke!

Mikkel


--
"At first just a rustle of canvas
And the gentlest breath on my face"
Sting, "The Wild Wild Sea"

Mikkel Z. Herold (07-05-2008)
Kommentar
Fra : Mikkel Z. Herold


Dato : 07-05-08 23:03

On 07-05-2008 23:37 Mikkel Z. Herold wrote:
>> <http://httpd.apache.org/docs/2.0/misc/rewriteguide.html>
>
> Takker - det vil jeg tjekke!

Well - nogle gange er løsningen så enkel, at man helt overser den! Man
kan selvfølgelig bare lave to RewriteRules i htaccess, én der matcher
stier med "f", og en der matcher stier uden "f" - sådan her:

RewriteEngine on
RewriteRule ^([a-z_\/\._]*)([0-9]*)(f)([a-z\.]*)$
/shared/show_image.html?src=/$1$4&width=$2&fixed_size=yes [R]
RewriteRule ^([a-z_\/\._]*)([0-9]*)([a-z\.]*)$
/shared/show_image.html?src=/$1$3&width=$2 [R]

Ingen grund til fancy conditionals - men de kunne nu være sjove at lære
alligevel.

Mikkel

--
"At first just a rustle of canvas
And the gentlest breath on my face"
Sting, "The Wild Wild Sea"

Michael Zedeler (07-05-2008)
Kommentar
Fra : Michael Zedeler


Dato : 07-05-08 22:41

Mikkel Z. Herold wrote:
> Endnu engang sidder jeg og roder med et regex, som jeg ikke kan få til
> at virke:
>
> Jeg vil gerne have den til at lave en sti som denne
> "/mappe/billede10.png" om til
> "/shared/show_image.html?src=/mappe/billede.png&width=10"
>
> Til det formål har jeg lavet dette regex, som virker:
>
> ereg_replace("^([a-z_\/\._]*)([0-9]*)([a-z\.]*)$",
> "/shared/show_image.html?src=/\\1\\3&width=\\2", $string)
>
> Så langt så godt, men nu vil jeg gerne kunne tilføje en valgfri
> parameter, hvis og kun hvis den oprindelige sti har et "f" efter
> billednummeret, altså hvis stien hedder f.eks. "/mappe/billede10f.png",
> så skal der sættes en ekstra parameter på den omformede sti, så den
> kommer til at hedde
> "/shared/show_image.html?src=mappe/billede.png&width=10&fixed_size=yes"
>
> Og det er her, det går galt. Det er ikke noget problem at tjekke, om der
> er et "f" - det gør jeg med ^([a-z_\/\._]*)([0-9]*)(f)?([a-z\.]*)$ - men
> hvordan får jeg det f omformet til strengen "&fixed_size=yes" i den nye
> streng, og vel at mærke kun, når der er et f - ellers skal der ikke
> sættes noget ind.

Det kan jeg ikke lige se hvordan du kan lave. Hvis der er tale om
udvidede pcre-kompatible udtryk, kan man måske slippe afsted med noget,
men det er ikke særlig oplagt.

Kan du ikke nøjes med at omskrive sådan her:

billede10f.png -> billede.png&width=10&parameters=f

og

billede10f.png -> billede.png&width=10&parameters=

Hvis det er dig der skriver scriptet der modtager værdierne og det er
php, burde det virke udemærket.

Nu hvor du bruger mod_rewrite, har du så undersøgt om ikke bare man kan
få den til at lave en serie af omskrivninger? Det burde kunne lade sig
gøre at løse problemet på den måde.

Mvh. Michael.

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409083
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste