De kracht van reguliere expressies in Google Analytics filters

filter1.gifEr zijn momenten dat je graag meerdere pagina's tegelijk wilt filteren of selecteren in een overzicht, conversiedoel of conversiepad. Dan moet je wel weten hoe de zogenaamde Reguliere Expressies in Google Analytics werken. Een simpele "head match" of "kop zoeken" waarmee gematched kan worden op het begin van een URL volstaat niet altijd.

Reguliere Expressies?
Ik zal eerst een beknopte omschrijving van de term Reguliere Expressies (vanaf nu: RE). RE's zijn ontworpen om te kunnen zoeken op een bepaald patroon. Stel je hebt een gigantisch document met heel veel tekst waar je de email adressen uit wilt halen. Met een RE kun je een patroon voor een email adres ontwerpen die dan op de tekst toegepast zal worden. Zo'n patroon kan er als volgt uit zien in pseudo code:

[a-z of 0-9]@[a-z of 0-9].[a-z]

De blokhaken geven de delen van een email adres aan. Binnen de blokhaken staan de mogelijke patronen die in dat deel mogen verschijnen. In een email adres bestaan de delen voor en na de @ uit letters of cijfers. En na de punt kunnen alleen letters staan. Dit is een heel simpel patroon die zou kunnen matchen op email adressen, ware het niet dat je hier nog veel efficiënter mee om kunt gaan aangezien er wel meer regels voor email adressen gelden:

  • geen spaties
  • geen underscores in het domein
  • niet alleen getallen in het domein
  • minimaal 2 letters in de tld
  • enz.

Een redelijk complete RE voor een geldig email adres ziet er dan ook ongeveer zo uit:

^(([^<>;()[\]\\.,;:@"]+(\.[^<>()[\]\\.,;:@"]+)*)|(".+"))@((([a-z]([-a-z0-9]*[a-z0-9])?)
|(#[0-9]+)|(\\[((([01]?[0-9]{0,2})|(2(([0-4][0-9])|(5[0-5]))))\.){3}(([01]?[0-9]{0,2})
|(2(([0-4][0-9])|(5[0-5]))))\]))\.)*(([a-z]([-a-z0-9]*[a-z0-9])?)|(#[0-9]+)|(\\[((([01]?
[0-9]{0,2})|(2(([0-4][0-9])|(5[0-5]))))\.){3}(([01]?[0-9]{0,2})|(2(([0-4][0-9])
|(5[0-5]))))\]))$

Ik ga hier verder niet op in, over RE's in het algemeen is genoeg te vinden.

Welke tekens ondersteunt Google Analytics dan?

In feite ondersteunt GA alle tekens, maar in het dagelijks gebruik zijn er enkele die makkelijk van pas kunnen komen. Ik zal ze hieronder één voor één toelichten, vervolgens zal ik een aantal voorbeelden tonen.

. matched elk denkbaar karakter
Met de punt kan heel simpel een vergelijking gemaakt worden voor elk denkbaar karakter. Wanner je dus wilt zoeken naar iets dat 4 tekens lang is zou je RE er zo uit kunnen zien: .... Maar vaak wordt de . in combinatie met de * of de + gebruikt. Zo kan er gezocht worden naar een hele rij tekens tot aan een bepaald stuk, bijvoorbeeld alles tussen de A en de G: A.*G

* matched voorgaande items 0 keer of vaker
+ matched voorgaande items 1 keer of vaker
? matched voorgaande items 0 of 1 keer
Zoals in bovenstaand stuk al genoemd is kun je met de *, + of ? een match maken met een voorgaande reeks. Dat houdt in dat een bepaald stuk patroon 0 tot meerdere keren voor kan komen. In het patroon [abcd]+ moet 1 van de 4 de letters 1 keer of vaker voorkomen voor er een match is. Eventueel is dit te varieren met de * of de ? al naar gelang de behoefte.

() onthoudt de gematchde inhoud binnen deze haken
Met haken kan een deel van een patroon opgegeven worden opgeslagen te worden. Zo kunnen bijvoorbeeld met dit patroon: [AB]+(CD) alle CD's in een tekst gevonden worden waar een A of B voor staat.

[] match 1 item binnen deze lijst
Om te kunnen matchen op een aantal tekens kan er een verzameling van toegestane tekens en reeksen gemaakt worden. Het patroon [abcd] geeft aan dat 1 van de tekens in de reeks voor moet komen. Andere geldige reeksen zijn bijvoorbeeld [ab12] of [,;#]

- maakt een selectie binnen een lijst
Om een match te kunnen maken op een aantal letter of cijfers kan er met de - een reeks aangegeven worden. De reeks a-z staat voor het hele alfabet en 0-9 voor alle numerieke getallen. [A-Z] staat weer voor alle hoofdletters. Een veelgebruikte combinatie om naar een reeks met alleen letters en cijfers te zoeken zonder andere leesteken is [a-zA-Z0-9]

| staat voor "of"
Er moeten wel eens keuzes gemaakt worden, als je bijvoorbeeld wilt zoeken naar een plaatje met de extensie .gif of .jpg. In een RE maak je dan op deze manier de keuze: (gif|jpg). Op deze manier wordt er alleen gematched als 1 van beide waardes voorkomt. PNG afbeeldingen worden zo niet gematched.

^ de match moet aan het begin van een veld staan
$ de match moet aan het einde van een veld staan
Wanneer je zeker weet dat het gezochte patroon aan het begin of einde staat kun je gebruik maken van de ^ aan het begin of de $ aan het einde van je patroon. Ook kun je beide tezamen gebruiken, wanneer ik op zoek ben naar de fiets.html pagina en niet de /map/fiets.html of fiets.html?pagina=2 pagina's wil hebben gebruik ik deze: ^/fiets.html$

\ escaped eerdergenoemde speciale karakters
Om ook te kunnen matchen op 1 van de eerdergenoemde speciale tekens kun je ze escapen met de \. Op die manier wordt de . niet als elk willekeurig teken gezien maar echt als een . en dat heb je best vaak nodig.

Toepassingen

Nu lijken de bovenstaande verhalen over de diverse tekens best moeilijk maar dat is het niet. Ik zal een aantal (door mij) veelgebruikte voorbeelden laten zien waarmee het gebruik duidelijker wordt.

Doelen instellen
Onderstaand screenshot is een fictief ingestelde conversiepad. Vanuit de pagina /producten/fietsen gaat men naar een willekeurige pagina in de map /producten/fietsen/. Dus bijvoorbeeld /producten/fietsen/velo. Vanuit daar doet men de bestelling op deze pagina: /producten/fietsen/velo/aanvraag om uiteindelijk uit te komen op 1 van de beide bedankt pagina's. Let op het gebruik van de ^ en de $ waarmee ik soms aangeef dat er niets achter of voor een bepaald adres mag komen. En in stap 3 kan het gedeelte /aanvraag achter elk adres komen te staan, er zijn wellicht honderden fietsen en evenzoveel bestel pagina adressen.

conversie.gif

IP nummers blokkeren in een filter
Ik heb voorbeelden gezien van uitsluiting filters waarin mensen per IP adres een filter gemaakt hadden. Om dit simpeler te houden is het makkelijker om alle IP's die je wilt uitsluiten van de meting als volgt in je filter te plaatsen:
123\.456\.123\.456|789\.345\.789\.345
De . wordt uiteraard ge-escaped omdat die echt als . gezien moet worden, en met de | in het midden geef je aan dat beide adressen een match kunnen zijn en geblokkeerd moeten worden. De reeks is makkelijk uit te breiden door er nog een | gevolgd door een IP nummer achter te plaatsen.

Bedankt pagina zoeken
Er zijn websites waar bijvoorbeeld op elke pagina een klein nieuwsbrief aanmeld formulier is geplaatst. Wanneer die verstuurd wordt keert men terug naar de originele pagina met als aanvulling ?mailform=succes. Je kunt je voorstellen dat in een site met 1000 pagina's er ook 1000 verschillende adressen kunnen zijn waar ?mailform=succes achter staat. Om die te matchen gebruiken we het volgende patroon:
\?mailform=succes$
Zo wordt alleen het einde van een adres bekeken en gecontroleerd op de waarde. Maar in sommige situaties stonden er al waardes achter de URL waardoor de toevoeging met een & begint. Dat kun je op deze manier oplossen:
(\?|&)mailform=succes$
Eerst vertel je dat er een ? (die wordt ge-escaped) of een & mag staan. Die moet weer gevolgd worden door mailform=succces, die weer aan het einde moet staan.

Bestanden in mappen zoeken
Stel dat je een map "info" hebt waar veel pagina's in staan. En uit die map wil je alleen het bezoek op de gebruikershandleidingen weergeven. Een adres van een gebruikershandleiding ziet er als volgt uit: GH gevolgd door een combinatie van getallen met als extensie .jsp of .aspx. Op dat moment zou je dit filter kunnen gebruiken:
^/info/GH[0-9]+\.(jsp|aspx)$
Kijk er eens rustig naar en je ziet dat het best moeilijk lijkt maar het best makkelijk is.

Conclusie

Ik gebruik de RE's dagelijks om diverse zaken uit adressen te kunnen filteren: even snel alle zoekwoorden met een bepaalde term erin opzoeken, alle adressen met een bepaalde waarde opzoeken, enz. Ik hoop dat ik het nu ook inzichtelijker gemaakt heb voor de minder geoefende. En wanner je vragen hebt, stel die in de comments of stuur me een mail.

Click to activate social bookmarks