paramètres d'url regex
j'ai créé mon propre module de newsletter et je suis tombé sur un (gros) problème. Le système formate toutes les urls avec des paramètres supplémentaires pour garder la trace des clics dans google analytics.
p.ex. Une url comme celle-ci
http://www.domain.com
devient comme ceci
http://www.domain.com/&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test
et une url comme celle-ci
http://www.domain.com/?page=1
devient comme ceci
http://www.domain.com/?page=1&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test
le premier exemple est bidon. Je sais que la première ampère doit être remplacée par une ampère et c'est là que le problème se pose. J'utilise ce modèle pour extraire url's
$pattern = array('#[a-zA-Z]+://([-]*[.]?[a-zA-Z0-9_/-?&%{}])*#');
$replace = array('&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test');
$body = preg_replace($pattern,$replace,$body);
est-ce que quelqu'un peut m'aider avec un regex correct et fonctionnel, donc le premier paramètre url contient toujours un questionmark au lieu d'un ampli?
4 réponses
il suffit d'utiliser
if(strpos($string,'?') !== false)
//add with ampersand
else
//add with question mark
pas regex, mais ça marcherait. Tout ce qu'il fait c'est Vérifier pour un ? et s'il n'est pas trouvé, changez le premier & en point d'interrogation.:
$url = (substr_count($url, '?')>0) ? $url : str_replace('&', '?', $url, 1);
une approche très simple serait de chercher une chaîne comme http://...&
où le ...
ne contient pas ?
point d'interrogation ou autres délimiteurs:
= preg_replace('#(http://[^\s"\'<>?&]+)&#', '?', $src);
mais il est probablement préférable si vous utilisez un restreint au lieu d'une classe de caractères niés:
$src = preg_replace('#(http://[\w/.]+)&#', '?', $src);
cette solution corrige toutes les URL qui ont une requête commençant par un &
(et qui manquent le ?
):
$re = '%([a-zA-Z]+://[^?&\s]+)&(utm_source=newsletter)%';
$body = preg_replace($re, '?', $body);