Я создал свой собственный модуль рассылки новостей и столкнулся с одной (большой) проблемой. Система форматирует все 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);