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?

1
demandé sur Nico 2011-04-15 17:16:53

4 réponses

il suffit d'utiliser

if(strpos($string,'?') !== false)
//add with ampersand
else
//add with question mark
1
répondu fingerman 2014-06-15 20:34:32

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);
0
répondu Hugo Delsing 2011-04-15 13:27:17

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);
0
répondu mario 2011-04-15 13:28:13

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);
0
répondu ridgerunner 2011-04-15 14:31:45