У меня есть строки, содержащие строку отслеживания, которую я хочу удалить. Регулярные выражения, казалось, были лучшим решением, но я не могу определить регулярное выражение, которое будет работать.
Примеры URL:
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:\/\/[^?]*?.*)(tracking=[^&]*)(.*)?
Если он совпадает с удалением второй группы из строки (той, которая содержит отслеживание)