scootergrisen wrote:
> Men tak i hvert fald jeg tror bare jeg skal have noget tid til at forstå
> det bedre.
Du har ret i at det kan være svært at forstå. Faktisk kan det virke som
sort snak indtil man fatter det, men det er utroligt kraftfuld og
fleksibelt, og man kan ofte gøre tingene med ganske få linjer.
Men dog er de grundlæggende ting egentligt ikke så svære.
Lad os tage et par eksempler:
(J[A-Z0-9])|#japan
Som nævnt før så ignoreres det efter nummertegnet, så vi har altså:
(J[A-Z0-9])|
Den lodrette streg betyder "eller", dvs. vi matcher denne linje eller
det der kommer på den næste linje.
Ofte skriver man udtrykket på en lang linje, men er det langt,
foretrækker jeg at dele det op som gjort her.
Alternativt kun man skrive: (J[A-Z0-9])|(K[A-C])|(K[F-K]) ....
men som du nok kan se, så mister man hurtigt overblikket.
Nå, men vi har nu for japan (uden eller-tegnet):
(J[A-Z0-9])
Når man læser regex er det en god ide at sige "efterfulgt af". Dvs. her
et J efterfulgt af bogstaverne A-Z eller tallene 0-9. Det som er inde i
klammer [] er karaktersæt, og her kan man benytte ranges/intervaller.
Der matches hvis blot et af tegnene matcher.
Som du ser er udtrykket inde i en parantes. Det er for at "fange"
resultatet så vi kan bruge det senere. Den første parantes er 1 (her
japan), den næste 2 (sri lanka) osv. Hvis deludtrykkene navngives, kan
man også tilgå dem ved at bruge deres navne. Der som du selv har
opdaget, ikke må indeholde danske bogstaver og mellemrum etc.
Når man angiver det regulære udtryk i fx preg_match() så skal det
afgrænses af et sæt tegn man selv vælger. Det skal bare være et tegn der
ikke findes i udtrykket. Ofte bruger man / men jeg kan bedre lide %
fordi det så sjældent bruges.
preg_match("%$stelNrRegEx%xi", $stelnummer, $match);
Her er selve udtrykket altså indeholdt i $stelNrRegEx, og det er
afgrænset af et sæt procenttegn. Derefter følger to såkaldte "modifiers"
(eller parametre om man vil) nemlig x og i. x tillader den udvidede
syntax med fx kommentarer, og i betyder ignore case.
De enkelte resultater vil så ligge i arrayet match, altså match[1]=japan
osv.
Linjen som opretter lande-arrayet er ret kompliceret:
$lande = explode("\n", preg_replace('%^\([^#]+#%m', '', $stelNrRegEx));
Jeg vil ikke trætte dig med en forklaring, blot sige at man også bare
kan oprette det manuelt, som det også er vist i koden udkommenteret:
$lande = array('japan','sri lanka' ...);
Her er et godt site om regex:
http://www.regular-expressions.info/
Og denne bog er fremragende:
http://regex.info/