Regular expressions Google Analytics

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Voor Google Analytics ben ik een funnel aan het opzetten aan de hand van regular expressions. Nu had ik nog nooit gehoord van regular expressions, maar na wat oefenen ben ik een redelijk eind gekomen om het werkende te maken. Maar ik zit nog met één probleem wat me niet lukt om op te lossen;

De URLs zijn opgebouwd als volgt: http://www.mysite.com/language/product/city/cartype

Voorbeeld

Twee stappen in de funnel zijn de volgende:

Step 2: mysite.com/pt/aluguel-de-carros/newark-airport-ewr-united-states-ewr

Step 3: mysite.com/pt/aluguel-de-carros/newark-airport-ewr-united-states-ewr/chevrolet-aveo

Daar waar "newark-airport-ewr-united-states-ewr" eigenlijk alles kan zijn (dus ook qua lengte en aantal dashes varieert), moet de regular expression in principe alles pakken. Ik gebruik daar de volgende voor:

/(en|pt|es)/(rental-cars|aluguel-de-carros|alquiler-de-coches)/([a-z]+.+)/

Het probleem is nu dat hij de URL bij Step 2 niet pakt, aangezien deze niet eindigt met een '/'. Hoe kan ik de regular expression zo ombuigen dat hij tot het '/' teken alles pakt?

Voor Step 3 gebruik ik deze regular expression:

/(en|pt|es)/(rental-cars|aluguel-de-carros|alquiler-de-coches)/([a-z])+.+/([a-z]+.+)

Deze werkt wel gewoon, aangezien hij niet de URL bij Step 2 pakt, maar wel de URL bij Step 3 (overigens heb ik zo'n flauw vermoeden dat de regular expressions die ik gebruik niet altijd even mooi zijn, maar met wat trial en error en het gebruik van http://regex.powertoy.org/ om te testen een redelijk eind gekomen).

Kan iemand me met dit probleem helpen?

Acties:
  • 0 Henk 'm!

  • leo-nard
  • Registratie: Februari 2010
  • Laatst online: 27-11-2023
Werk dit niet: /(en|pt|es)/(rental-cars|aluguel-de-carros|alquiler-de-coches)/([a-z]+.+)$

Met een '$' definieer je het einde van een string.

Acties:
  • 0 Henk 'm!

  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Dat dacht ik in eerste instantie ook, maar als je het test met een regex tool, dan matched hij niet met de desbetreffende URL string.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Vraagteken achter je laatste slash zetten.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Als er een vraagteken achter wordt geplaatst, dan krijg je deze regex:

/(en|pt|es)/(rental-cars|aluguel-de-carros|alquiler-de-coches)/([a-z]+.+)/

Maar deze regex pakt zowel de URL van Step 2 als de URL van Step 3;

Step 2: mysite.com/pt/aluguel-de-carros/newark-airport-ewr-united-states-ewr

Step 3: mysite.com/pt/aluguel-de-carros/newark-airport-ewr-united-states-ewr/chevrolet-aveo

Hij zou alleen de URL van Step 2 moeten pakken. Ook als je achter de bovenstaande regex weer een $ zet (om het einde van een string aan te geven), dan pakt ie van beide steps weer geen enkele URL.

Edit: Overigens test ik dit allemaal met http://regex.powertoy.org/

[ Voor 5% gewijzigd door JurjenK op 24-08-2011 16:12 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

/(en|pt|es)/(rental-cars|aluguel-de-carros|alquiler-de-coches)/([a-z][^/]+)/?

[ Voor 3% gewijzigd door NMe op 24-08-2011 16:18 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Aah, dat lijkt inderdaad te werken, bedankt!

/(en|pt|es)/(rental-cars|aluguel-de-carros|alquiler-de-coches)/([^/]+)/?

Deze pakt inderdaad de URL van Step 2 helemaal zoals het hoort. Van de regex van Step 3 wordt dan

/(en|pt|es)/(rental-cars|aluguel-de-carros|alquiler-de-coches)/([^/]+)/([^/]+)/?

en die werkt ook.

Nog 1 vraag, de regex van Step 2 pakt een deel van de URL van Step 3 (ondergestreepte gedeelte);

mysite.com/pt/aluguel-de-carros/newark-airport-ewr-united-states-ewr/chevrolet-aveo

Moet een regex in Google Analytics precies matchen eer het onder de goede step wordt geregistreerd? Kan het niet via Google vinden, alhoewel het me een redelijke aanname lijkt dat het wel zo is.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je geen markering aangeeft voor het begin van de string met een ^ of het einde van de string met een $ dan zal hij alles matchen wat voldoet aan jouw expressie, niet per se de volledige string. Als hij met de volledige string niet kan matchen maar met een deel wel, dan zal 'ie dat doen. Dat fix je dus in dit geval op de manier die leo-nard in "Regular expressions Google Analytics" al zei. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Hmm, zodra ik een begin of einde van een string ga definiëren, pakt ie gelijk niks meer. Met deze regex voor Step 2 (zoals door jouw suggestie) pakt ie het volgende (ondergestreept);

Regex (step2): /(en|pt|es)/(rental-cars|aluguel-de-carros|alquiler-de-coches)/([a-z][^/]+)/?

Step2 URL: mysite.com/pt/aluguel-de-carros/newark-airport-ewr-united-states-ewr

Step3 URL: mysite.com/pt/aluguel-de-carros/newark-airport-ewr-united-states-ewr/chevrolet-aveo

Step2 URL pakt ie inderdaad zoals het hoort, maar Step3 URL pakt ie ook een deel. Zodra ik een eind aan de string definieer (--> /(en|pt|es)/(rental-cars|aluguel-de-carros|alquiler-de-coches)/([a-z][^/]+)/?$ of ^/(en|pt|es)/(rental-cars|aluguel-de-carros|alquiler-de-coches)/([a-z][^/]+)/?$ ), pakt ie niets meer (dus ook niet de Step2 URL).

Enig idee wat ik hier fout doe? :)

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

het laatste deel
([a-z][^/]+)/?$

matcht 1x een string met een /, jij wil dat dit nul of meerdere keren kan, dus moet je daar
([^/]+/)*$

van maken.

Deze zegt:
match alles wat geen / is ( tenminste 1 ), gevolgd door een enkele /.
Deze hele match ( bovenstaande regel ) mag 0 of oneindig vaak voorkomen

veiliger is waarschijnlijk
[cmd]([a-z]+/)*$[/cmd]
maar of dat matcht hangt van je urls af.

wat NMe zegt, maar je begrijpt het idee denk ik wel

[ Voor 7% gewijzigd door Arjan op 25-08-2011 10:17 ]

oprecht vertrouwen wordt nooit geschaad


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dan zit hij weer met hetzelfde greediness-probleem dat die [^/] oploste hierboven. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Hmm, het probleem zit 'm in dat de regex in Step 2 zo greedy moet zijn dat ie alles moet pakken (behalve een '/') na

alguel-de-carros/ 


Maar een '/' komt zal nooit voorkomen in een URL bij Step 2. Bij Step 3 moet de regex zo zijn dat ie

carros/xx-xxxx-xxx/xxxxx-xxx-xxx 


pakt. Nu moet de regex bij Step 2 zo zijn dat ie niet matched zodra er een '/' in voorkomt, maar voor de rest wel alles pakt. Maar ik kom er niet uit wat voor regex het moet zijn dat ie niet meer matched zodra er een '/' in voorkomt.

Edit: Ik heb de bovenstaande opties (en vele variaties) ook geprobeerd, maar (helaas) niet het gewenste resultaat gekregen. Ik gebruik deze tool om te checken of iets wel of niet werkt (welke een andere is dan in m'n eerste post).

[ Voor 21% gewijzigd door JurjenK op 29-09-2011 18:13 ]


  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

dan moet je eindigen met:
code:
1
[^/]$


oftewel, het laatste karakter mag geen '/' zijn :)

oprecht vertrouwen wordt nooit geschaad


  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Arjan schreef op donderdag 29 september 2011 @ 20:56:
dan moet je eindigen met:
code:
1
[^/]$


oftewel, het laatste karakter mag geen '/' zijn :)
Heb ik inderdaad geprobeerd, maar deze regex

code:
1
/(en|pt|es)/(rental-cars|aluguel-de-carros)/([^/]$)


pakt deze URL niet (volgens deze tool): mysite.com/pt/aluguel-de-carros/miami-airport-mia-united-states-mia (step 2)

Als je deze regex gebruikt;

code:
1
/(en|pt|es)/(rental-cars|aluguel-de-carros)/[^/]


dan pakt ie deze URL wel: mysite.com/pt/aluguel-de-carros/miami-airport-mia-united-states-mia (step 2), maar ook deze URL: mysite.com/pt/aluguel-de-carros/miami-airport-mia-united-states-mia/chevrolet-aveo (step 3).

En deze fout krijg ik er maar niet uit, ófwel hij is te greedy en pakt step 2 & 3, ófwel hij is niet greedy genoeg en pakt step 2 & 3 beiden niet..

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat doet die ampersand daar? En je weet dat [^/] maar één karakter matcht, niet de hele string die achter /(en|pt|es)/(rental-cars|aluguel-de-carros)/ staat?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
NMe schreef op donderdag 29 september 2011 @ 22:20:
Wat doet die ampersand daar? En je weet dat [^/] maar één karakter matcht, niet de hele string die achter /(en|pt|es)/(rental-cars|aluguel-de-carros)/ staat?
Die ampersand was inderdaad een foutje, ondertussen aangepast. :) [^/] matched inderdaad maar één karakter, maar wordt de regex zo aangepast;

code:
1
/(en|pt|es)/(rental-cars|aluguel-de-carros)/[a-z]*[^/]$


dan is ie niet greedy genoeg, als je $ toevoegd, dan is ie weer te greedy..

  • André
  • Registratie: Maart 2002
  • Laatst online: 09-09 22:26

André

Analytics dude

/(en|pt|es)/(rental-cars|aluguel-de-carros)/[a-zA-Z0-9\-_]+$
/(en|pt|es)/(rental-cars|aluguel-de-carros)/[a-zA-Z0-9\-_]+/

Zoiets dan?

  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
André schreef op donderdag 29 september 2011 @ 22:31:
/(en|pt|es)/(rental-cars|aluguel-de-carros)/[a-zA-Z0-9\-_]+$
/(en|pt|es)/(rental-cars|aluguel-de-carros)/[a-zA-Z0-9\-_]+/

Zoiets dan?
Nice, dat schijnt inderdaad te werken!

De oplossing lijkt relatief simpel. Daar waar ik de fout in ben gegaan is dat ik alleen [a-z] deed, en dus niet de hyphens meenam?

  • André
  • Registratie: Maart 2002
  • Laatst online: 09-09 22:26

André

Analytics dude

Lijkt er op ja :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Natuurlijk. Die regexp engine kan niet raden wat jij wil, dus als je a-z zegt, dan matcht 'ie ook echt alleen a-z-karakters. Vervolgens match je één karakter dat géén slash is, dus waarschijnlijk een hyphen. De rest van je slug pak je dan niet mee.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • André
  • Registratie: Maart 2002
  • Laatst online: 09-09 22:26

André

Analytics dude

Let er op dat veel online tools niet helemaal matchen met de regexp engine van GA. Negative lookaheads werken bijvoorbeeld niet (meer). Het beste kun je testen in het filterveld boven je "Pages" rapport. Wel even openklappen en de matching optie op regex zetten, want waar regex eerst de standaard was is dat nu niet meer zo ;)

Acties:
  • 0 Henk 'm!

  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Ook daar werken ze! Aan de eerste resultaten te zien werkt het helemaal. Top, bedankt!
Pagina: 1