parametri url regex

Ho creato il mio module di newsletter e ho incontrato un (grosso) problema. Il sistema formatta tutti gli URL con parametri aggiuntivi per tenere traccia dei clic in google analytics.

ad esempio un url come questo

http://www.domain.com

diventa così

http://www.domain.com/&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test

e un url come questo

http://www.domain.com/?page=1

diventa così

http://www.domain.com/?page=1&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test

Il primo esempio è fasullo. So che la prima e commerciale deve essere sostituita da una e commerciale ed è qui che si verifica il problema. Sto usando questo model per estrarre l'url

$pattern = arrays('#[a-zA-Z]+://([-]*[.]?[a-zA-Z0-9_/-?&%\{\}])*#'); $replace = arrays('\\0&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test'); $body = preg_replace($pattern,$replace,$body); 

Qualcuno può aiutarmi con una regex corretta e funzionante, quindi il primo parametro url contiene sempre un punto interrogativo al posto di una e commerciale?

basta usare

 if(strpos($string,'?') !== false) //add with ampersand else //add with question mark 

Non regex, ma functionrebbe. Tutto ciò che fa è controllare un? e se non viene trovato, cambia il primo e il punto interrogativo .:

 $url = (substr_count($url, '?')>0) ? $url : str_replace('&', '?', $url, 1); 

Un approccio molto semplice sarebbe cercare una string come http://...& where il ... contiene no ? punto interrogativo o altri delimitatori:

 = preg_replace('#(http://[^\s"\'<>?&]+)&#', '$1?', $src); 

Ma probabilmente è meglio se usi una class di caratteri ristretta invece di una class di caratteri negata:

 $src = preg_replace('#(http://[\w/.]+)&#', '$1?', $src); 

Questa soluzione corregge tutti gli URL che hanno una query che inizia con un & (e manca il ? ):

 $re = '%([a-zA-Z]+://[^?&\s]+)&(utm_source=newsletter)%'; $body = preg_replace($re, '$1?$2', $body);