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);