WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Rexexp-problem (https://www.wn.se/forum/showthread.php?t=34672)

oddholst 2009-01-24 01:17

Min rubrik och beskrivning kanske inte är särskilt beskrivande men den reflekterar min frustration över att inte få det att fungera.

Jag har följande rad kod:
Citat:

if (preg_match("\/[1-9].[0-9]*[0-9a-zA-Z-]*\.(jpg|tif)",$_SERVER["REQUEST_URI"]) == 1)
och får följande fel:
Citat:

Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in /xxx/x/xxxx/www/sub/imagearchive/missing.php on line 6
Jag har ett par exempel på filnamn jag vill matcha:
"/1234.jpg"
"/1234_testbild7.jpg"
"/4110_Pannkakor-med-sylt.tif"

Alltså, strängen skall innehålla följande (i ordning):
* ett snedstreck
* en serie siffror som inte börjar på noll
* eventuellt ett understreck
* eventuellt tecken som innehåller bokstäver, siffror eller bindestreck
* en punkt
* Antingen jpg eller tif, med gemener eller versaler.

Så jag behöver hjälp. Jag har försökt ett antal varianter och googlat men inte funnit någon lösning ännu....

kullervo 2009-01-24 01:23

Du har glömt att du ska stoppa in en delimiter som första och sista tecken i stängen. Använd förslagsvis en slash.

oddholst 2009-01-24 01:53

Citat:

Originally posted by kullervo@Jan 24 2009, 02:23
Du har glömt att du ska stoppa in en delimiter som första och sista tecken i stängen. Använd förslagsvis en slash.
Aha.. det har jag missat helt. Vad är delimiters till för och varför kan man använda olika. Det fungerade för övrigt.

Jag inser att jag letar efter någon annan funktion än den i mitt första inlägg. Jag vill veta om strängen helt passar in i testet eller inte alls. Vad skall jag använda då?

Är själva uttrycket ovan i sig korrekt enligt min beskrivning?

Jag behöver en liten knuff framåt igen, tror jag...

oddholst 2009-01-24 12:52

Citat:

Ursprungligen postat av oddholst
Citat:

Ursprungligen postat av kullervo
Du har glömt att du ska stoppa in en delimiter som första och sista tecken i stängen. Använd förslagsvis en slash.


Nu har jag vaknat igen och fortsätter att plåga mig med detta och er med mina frågor.
Kod:

if (preg_match("/^\/[1-9].[0-9]*_[0-9a-zA-Z-]*\.(jpg|tif)$/",$_SERVER["REQUEST_URI"]) == 1)
Är detta test korrekt för att jag skall testa att filnamnet är som jag vill ha det och ingenting annat före eller efter?

Sen kommer nästa pilsner. Jag skall ta ut numret ur filnamnet, dvs det mellan första /-tecknet och den första icke-numeriska tecknet som kommer.

Exempel:
/12345.jpg -> 12345
/12367_Test.jpg -> 12367
/12389_Test-720.jpg -> 12389

Jag misstänker att det även här är någon regexp-funktion som kommer till användning...

martine 2009-01-25 04:09

Citat:

Ursprungligen postat av oddholst
Sen kommer nästa pilsner. Jag skall ta ut numret ur filnamnet, dvs det mellan första /-tecknet och den första icke-numeriska tecknet som kommer.

Exempel:
/12345.jpg * * -> *12345
/12367_Test.jpg *-> 12367
/12389_Test-720.jpg *-> 12389

Jag misstänker att det även här är någon regexp-funktion som kommer till användning...

Kod:

if(preg_match('/^\/([1-9][0-9]*)_[0-9a-z-]*\.(?:jpg|tif)$/i',$_SERVER["REQUEST_URI"],$m)) {
$nummer = $m[1];
}

Citat:

Ursprungligen postat av oddholst
SAha.. det har jag missat helt. Vad är delimiters till för och varför kan man använda olika. Det fungerade för övrigt.

Behövs eftersom inte php har en datatyp för regexp:ar som t.ex. Perl eller JavaScript. Man kan använda olika för att slippa skriva så många "\", i t.ex. "http://" blir enklare med !http://! än "/http:\/\//" att tyda.

oddholst 2009-01-25 13:04

Citat:

Originally posted by martine@Jan 25 2009, 05:09
Kod:

if(preg_match('/^\/([1-9][0-9]*)_[0-9a-z-]*\.(?:jpg|tif)$/i',$_SERVER["REQUEST_URI"],$m)) {
$nummer = $m[1];
}

Behövs eftersom inte php har en datatyp för regexp:ar som t.ex. Perl eller JavaScript. Man kan använda olika för att slippa skriva så många "\", i t.ex. "http://" blir enklare med !http://! än "/http:\/\//" att tyda.

Aha... jag tror jag börjar förstå. Man skickar in den variabel man använder som "bärare" av resultatet som tredje argument i preg_match.

Jag tror jag skall bli självgående i denna fråga nu. Tack för hjälpen!

martine 2009-01-26 17:40

Citat:

Originally posted by oddholst@Jan 25 2009, 14:04

Aha... jag tror jag börjar förstå. Man skickar in den variabel man använder som "bärare" av resultatet som tredje argument i preg_match.

Jag tror jag skall bli självgående i denna fråga nu. Tack för hjälpen!

Så kan man uttrycka det. Det är ett lite bakvänt sätt att tilldela en variabel ett värde men på så sätt men så fungerar det. Man kan med fördel granska resultatet med print_r() men det har du säkerligen redan listat ut.

Det du vill fånga in sätter du i paranteser () och om du vill slippa få med ett värde (eller undvika processorbeslatningen) så kan du använda (?: med ) istället, t.ex.:

/(Jag vill )(?:inte) /

Regexp är spännande och praktiskt men lite klurigt ibland.


Alla tider är GMT +2. Klockan är nu 05:30.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson