Регулярное выражение для фильтрации параметров отслеживания URL-адресов в HTML

У меня есть строки, содержащие строку отслеживания, которую я хочу удалить. Регулярные выражения, казалось, были лучшим решением, но я не могу определить регулярное выражение, которое будет работать.

Примеры URL:

  • http://example.com?tracking=foo
  • http://example.com/bar.html?tracking=foo
  • http://example.com?tracking=foo&param=baz
  • http://example.com/bar.php?param=baz&tracking=foo

tracking=foo следует удалить, где foo может быть практически любым, кроме & URL, без отслеживания не следует трогать.

Лучший снимок, который я получил, это /(http:\/\/[^?]*?.*)tracking=[^&]*&?(.*?["|\'])/i но он тоже соответствует с помощью [^&]* -part, тем самым устраняя все, что находится за ссылкой, если после URL-адреса отслеживания нет второго параметра.

И я использую его так, как сейчас, в $html содержится весь html для вывода страницы, и я хочу удалить отслеживание из всех URL-адресов внутри:

 $html = preg_replace($pattern, '$1$2', $html); 

Таким образом, минимум $ html будет содержать следующее:

 <body> <a href="[one of the examples above]">Some Link</a> </body> 

Вы должны сделать это, parse_url URL-адрес, используя parse_url и parse_str . Это делает вещи намного проще, чем использование регулярного выражения.

 <?php $params = array(); $url = "http://example.com/bar.php?param=baz&tracking=foo"; $url_parts = parse_url( $url); parse_str( $url_parts['query'], $params); // Remove the "tracking" parameter if( isset( $params['tracking'])) { unset( $params['tracking']); } 

Теперь вам просто нужно перестроить строку с помощью частей в $url_parts и остальных параметров в $params . Вы можете сделать это с помощью http_build_query .

Попробуйте что-то подобное, хотя я не тестировал его, поэтому ему понадобятся некоторые изменения:

 $url = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . '?' . http_build_query( $params); 

Для вашего конкретного случая использования я бы использовал класс DOMDocument PHP для анализа HTML-кода, а затем захватил все URL-адреса, а затем использовал приведенное выше, чтобы удалить параметр отслеживания. Однако, если вы должны использовать регулярное выражение, вы можете использовать общее регулярное выражение для поиска только URL-адресов, а затем применить вышеописанное к каждому URL-адресу, который вы найдете, используя preg_replace_callback .

 /tracking=.*?(?=(&|$|\r|"))/ 

Должно соответствовать всем tracking=foo . Просто замените пустую строку.

http://regexr.com?30ofo

В качестве модификации вашего собственного регулярного выражения (http:\/\/[^?]*?.*)(tracking=[^&]*)(.*)?

Если он совпадает с удалением второй группы из строки (той, которая содержит отслеживание)