Существует ли регулярное выражение для удаления определенных переменных запроса из URI? - PullRequest
0 голосов
/ 04 июня 2009

У меня есть набор HTML, который генерируется демоном с использованием C, XML и XSL. Затем у меня есть PHP-скрипт, который берет HTML-разметку и отображает ее на экране

У меня огромный набор разметки, совместимой с XHTML 1. Мне нужно изменить все ссылки в разметке, чтобы удалить &utm_source=report&utm_medium=email&utm_campaign=report.

Пока что я рассмотрел два варианта.

  1. Выполните поиск регулярных выражений в бэкэнде PHP, который обрезает код Google Analytics
  2. Напишите несколько Jquery для циклического перемещения по ссылкам, а затем вырежьте код Analytics из ссылки.

Препятствия:

  1. HTML может быть ОГРОМНЫМ. И.Е. более 4 МБ (выполнялись некоторые тесты, они в среднем около 100 КБ)
  2. Это должно быть быстро. Мы получаем примерно 3K Мысли?

Сейчас я пытаюсь использовать str_replace('&utm_source=report&utm_medium=email&utm_campaign=report','',$html);, но он не работает.

Ответы [ 8 ]

2 голосов
/ 04 июня 2009

Вы можете использовать sed или другой низкоуровневый инструмент для удаления этих частей:

find /path/to/dir -type f -name '*.html' -exec sed -i 's/&utm_source=report&utm_medium=email&utm_campaign=report//g' {} \;

Но это уберет эту строку где угодно, а не только в URL. Так что будь осторожен.

1 голос
/ 04 июня 2009

, если строка всегда одна и та же, самая быстрая функция php, которую я нашел, strtr

PHP strtr

string strtr ( string $str , string $from , string $to )

$html = strtr($html, array('&utm_source=report&utm_medium=email&utm_campaign=report' => ''));

Очевидно, вам нужно будет измерить скорость, но это должно быть там.

0 голосов
/ 22 ноября 2012

Я столкнулся с этой проблемой пару лет назад и придумал следующее регулярное выражение для замены любых экземпляров этих переменных utm в URL:

/(\?|\&)?utm_[a-z]+=[^\&]+/

Пример использования:

preg_replace('/(\?|\&)?utm_[a-z]+=[^\&]+/', '', 'http://mashable.com/2010/12/14/android-quick-start-guide/?utm_source=twitterfeed&utm_medium=twitter&utm_campaign=Feed%3A+Mashable+%28Mashable%29');

Я писал об опыте здесь

0 голосов
/ 05 июня 2009

Я в итоге отложил использование str_replace и заменил строку во всем содержимом документа: (.

0 голосов
/ 04 июня 2009

PHP preg_replace_all() сделает это довольно быстро, если вы запустите его в режиме CGI в бэкэнде. Почему бы не использовать cronjob для запуска сценария php иногда для обработки всех ваших HTML? Таким образом, ваш php-скрипт внешнего интерфейса будет помещать обработанное содержимое в браузер без каких-либо вычислений.

0 голосов
/ 04 июня 2009

регулярное выражение является одним из способов. Кроме того, вы можете использовать XPath, чтобы найти все ссылки в документе, а затем работать с каждой из них в цикле. Поскольку это документ XHTML и, если предположить, что он правильно сформирован, такой подход представляется разумным.

0 голосов
/ 04 июня 2009

Не совсем RegExp, но он может помочь вам (не тестировался):

$xmlPrologue = '<?xml version="1.0"?>';
$source = '...'; // you're business

$dom = new DOMDocument($source);
$dom->loadXML($source);

$links = $dom->getElementsByTagName('a');

foreach ($links as $link) {
    list($base, $queryString) = explode('?', $link->getAttribute('href'));

    // read GET parameters inside an array
    parse_str(, $queryString/* assigned by reference */);

    // get rid of unwanted GET params
    unset($queryString['utm_source']);
    unset($queryString['utm_medium']);
    unset($queryString['utm_email']);
    unset($queryString['utm_report']);

    // recompose query string
    $queryString = http_build_query($queryString, null, '&amp;');
    // or (not sure which we'll work the best)
    $queryString = http_build_query($queryString, null, '&');

    // assign the newly cleaned href attribute
    $link->setAttribute('href', $base . '?' . $queryString);
}

$html = $dom->saveXML();

// strip the XML declaration. Puts IE in quirks mode
$html = substr_replace($html, '', 0, strlen($xmlPrologue));
$html = trim($html);

echo $html;
0 голосов
/ 04 июня 2009

С такими большими кусками HTML, я бы отправил это на внешний процесс, вероятно, на Perl-скрипт

Я не уверен, так как никогда не пытался анализировать что-либо рядом с таким большим количеством текста, но я готов быть уверен, что PHP не собирается делать это быстро.

Какова ваша ожидаемая нагрузка? Как часто вы собираетесь делать этот тип обработки? Это звучит как то, что вы бы сделали как пакетную операцию, которая, по общему признанию моего ограниченного опыта с такими задачами, не обязательно должна быть супер быстрой, но достаточно быстрой, чтобы она выполнялась за разумное время (т. Е. ты не ждешь этого всю ночь или что-то еще)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...