Avatar billede fizk Nybegynder
18. november 2005 - 18:33 Der er 9 kommentarer og
1 løsning

Forklaring på Regular Expression

Jeg har søgt og søgt og søgt efter en forklaring på hvordan reg. exp. virker og jeg har fundet den, men jeg fatter seriøst HAT af alle ting der følger med.
Jeg er med så langt at man kan tage en tekststreng og finde ud af om det er tekst eller bogstaver.

Dog taber jeg sporet når det kommer til noget som
if (preg_match ('/<a href="(\S+)"><img src="(\S+)"><\/a>/', $linje))
pga. alle de ting som f.eks. (\S+) det kan jeg overhovedet ikke se noget logisk i!

Så nu efterlyser jeg en stille og rolig guide til hvordan man grundlæggende bruger Reg. Exp - på dansk!

Det jeg skal bruge det til er at finde alle billeder på en side ;)

På forhånd tak!
Avatar billede dmdisco Nybegynder
18. november 2005 - 20:07 #1
hent det lille program regexbuddy http://www.regexbuddy.com/ så bliver det lettere at overskue hvad de forskellige regex betyder og i hvad sammenhæng
Avatar billede jakobdo Ekspert
18. november 2005 - 20:28 #2
regexpbuddy.com all-the-way ja!
Men du bør også finde lidt info her: http://www.regular-expressions.info/
Avatar billede johan.o Nybegynder
19. november 2005 - 00:55 #3
Jeg ved at du efterspørger sider på dansk, men da jeg ikke kender nogen vil jeg istedet give dig et par engelsk sprogede :

http://dk.php.net/manual/da/reference.pcre.pattern.syntax.php

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/js56reconIntroductionToRegularExpressions.asp

Mvh. Johan
Avatar billede nielle Nybegynder
19. november 2005 - 09:37 #4
En forklaring af det helt konkrete tilfælde (\S+):

\s, med lille 's', betyder "et whitespace tegn". Dette matcher mellemrum, tabulatortegn og linjeskift (både carriage return, \r, og linefeed, \n).

\S matcher et tegn som *ikke* er et whitespace.

Dette konvention, store og små bogstaver, har vi også andre steder:

\d matcher '0', '1', '2', ... og '9', og \D matcher alt som ikke er '0', '1', '2', ... eller '9'. Ligeledes med \w, \W og \b, \B.

Tegnet '+' betyder "et eller flere", og derfor er:

\S+

- det samme som "et eller flere tegn, som ikke er et whitespace". Der er også et tegn, '*', som betyder "nul eller flere".

Når man arbejder med regulære udtryk, så sker det ofte at man er interesseret i at bruge det som man nu har matchet på. Det er så her at () kommer ind:

(\S+)

Dette betyder simpelthen at regex-motoren skal huske de "et eller flere, non-whitespace tegn" som blev hentet ud. Med et møsnter (pattern) som dette:

'/<a href="(\S+)"><img src="(\S+)"><\/a>/'

- er programmøren derfor intereseret i at få det url ud som gemmer sig i href'en, samt det url som gemmer sig i src'en.

Jeg håber at det kastede lys over sagen?
Avatar billede nielle Nybegynder
19. november 2005 - 09:42 #5
I øvrigt er der denne artikel:

http://www.eksperten.dk/artikler/780
Avatar billede fizk Nybegynder
19. november 2005 - 13:21 #6
Ok, det se jo godt ud, men der er én ting jeg ikke har kunnet finde ud af ... Og det er flg: Man kan med preg_replace lave et trick, så den f.eks. tager alt mellem og og lægger det over i en variabel, eller hvad man nu kan kalde det, så man kan få det frem igen ved at skrive 1, er der nogen der kan forklare mig den?
Avatar billede nielle Nybegynder
19. november 2005 - 20:22 #7
Jo, det drejer egentligt om det jeg allerede har nævnt mht. parenteserne.

Hvis vi lige starter med en modifiseret version af et af dine oprindelige eksempler:

$linje = preg_replace('/<a href="(\S+)"><img src="(\S+)"><\/a>/', 'URL: $1 :: Image: $2', $linje);

Som nævnt er ideen med paranteserne, at man ønsker at huske det der står inden i dem til senere. Her er det altså det som står i href'en og det som står i src'en der skjal huskes. Siden at der er to parenteser, behøver vi dog en mekanisme til at skelne mellem det der står i den første parentes og det der står i den anden. Det er derfor at det hedder $1, for indholdet af den første, og $2 for indholdet af den anden parentes.

Hvis vi nu putter denne her:

$linje = '<a href="http://www.eksperten.dk"><img src="http://www.eksperten.dk/img/elogo.png"></a>';

- igennem den ovenstående preg_replace får vi derfor dette:

$linje = 'URL: http://www.eksperten.dk :: Image: http://www.eksperten.dk/img/elogo.png';

Jeg håber på at det var forståligt?


Men altså, for at vi skal kunne skelne mellem indholdet af den 1., 2., 3., ... parentes, så hedder det $1, $2, $3, ... osv.

I mange tilfælde har vi imidlertid kun en parentes, og derfor vil det der også kun være den første, $1, som man ser der. Ser man f.eks. på såkaldt BB-kode, vil man f.eks. kunne se sådan noget som i dit eksempel:

blah-blah http://www.eksperten.dk/img/elogo.png blah-blah

... og dette skal så laves om til:

blah-blah <img src="http://www.eksperten.dk/img/elogo.png"> blah-blah

Dette kan man så gøre med en preg_replace, som kunne se nogenlunde sådan her ud:

$linje = preg_replace('![img](.*?)[/img]!g', '<img src="$1">', $linje);

Denne fungere ved at det vi finder imellem parenteserne, altså "http://www.eksperten.dk/img/elogo.png", bliver indsat i src'en.
Avatar billede fizk Nybegynder
19. november 2005 - 22:17 #8
Oho, så med andre ord, så det man "piller fra" kommer automatisk over i en variabel, det  er da supersmart!
Hvis du lige smider et svar, så får du dine pts!
Avatar billede nielle Nybegynder
19. november 2005 - 23:04 #9
Svar :^)
Avatar billede nielle Nybegynder
21. november 2005 - 18:59 #10
Takker 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