регулярные выражения url

Я создал свой собственный модуль рассылки новостей и столкнулся с одной (большой) проблемой. Система форматирует все URL-адреса с дополнительными параметрами, чтобы отслеживать клики в Google Analytics.

например, такой URL-адрес

http://www.domain.com

становится таким

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

и такой URL-адрес

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

становится таким

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

Первый пример – фиктивный. Я знаю, что первый амперсанд должен быть заменен амперсандом, и именно там возникает проблема. Я использую этот шаблон для извлечения url

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

Может ли кто-нибудь помочь мне с правильным и рабочим регулярным выражением, поэтому первый параметр url всегда содержит вопросительный знак вместо амперсанда?

просто используйте

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

Не регулярное выражение, но это сработает. Все, что он делает, это проверить? и если он не найден, измените первый и на вопросительный знак .:

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

Очень простой подход – искать строку, такую ​​как http://...& где ... содержит ? вопросительный знак или другие разделители:

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

Но, вероятно, лучше всего использовать ограниченный, а не отрицательный класс символов:

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

Это решение фиксирует все URL-адреса, у которых есть запрос, начинающийся с & (и не хватает ? ):

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