Bir URI özel sorgu değişkenleri soymak için normal bir ifade var mı?

8 Cevap php

Ben C, XML ve XSL kullanarak bir daemon tarafından oluşturulan HTML bir grup var. Sonra HTML biçimlendirme alır ve ekranda görüntüleyen bir PHP komut dosyası var

Ben XHTML 1 uyumlu işaretleme büyük bir sargı var. Ben kaldırmak için biçimlendirme bağlantıları tüm değiştirmeniz gerekir &utm_source=report&utm_medium=email&utm_campaign=report.

Şimdiye kadar iki seçenek kabul ettik.

  1. Analytics kodunu kırpar PHP backend bir regex arama yapın
  2. Linkler aracılığı döngü bazı jQuery yazmak ve sonra href gelen Analytics kodunu Döşeme.

Engeller:

  1. HTML BÜYÜK olabilir. I.E. 4MB daha (bazı testler koştu, onlar 100Kb yaklaşık olarak ortalama)
  2. It has to be fast.We get approximately 3K Thoughts?

Şu anda str_replace('&utm_source=report&utm_medium=email&utm_campaign=report','',$html); kullanmaya çalışıyorum ama işe yaramıyor.

8 Cevap

(: Ben sonunda str_replace kullanarak ve belgenin tüm içeriği ile dize yerine ertelenmiş.

Bunu parçalarını kaldırmak için sed ya da diğer düşük seviyeli aracını kullanabilirsiniz:

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

Ama bu sadece URL'leri yerde değil, bu dize kaldırmak istiyorsunuz. Bu yüzden dikkatli olun.

dize her zaman hızlı php fonksiyonu aynı olup olmadığını, bunun için bulduk edilir strtr

PHP strtr

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

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

Açıkçası kriter hız gerekir, ama bu kadar olmalıdır.

, Muhtemelen bir perl script, harici bir işlem için bu büyük farm out ediyorum HTML parçaları ile

Ben her yerde o kadar metnin yakınında ayrıştırmak teşebbüs asla beri olumlu değilim, ama PHP hızlı bir şekilde bunu yapmak için gitmiyor olmaya hazırım.

Beklenen yük nedir? Ne kadar sıklıkla işleme bu tür yapmak zorunda olacak? Bu, bu tür görevler ile benim kuşkusuz sınırlı deneyim, zorunlu olarak süper hızlı, ama o zaman (yani makul bir miktarda idam edeceğini yeterince hızlı gerekmez, bir toplu işlem olarak yapmak istediğiniz bir şey gibi geliyor siz) bir gecede ya da ne olursa olsun bunun için bekleyen değil

Regex bir yoludur. Alternatif olarak belge içinde tüm bağlantıları bulmak için XPath kullanın ve daha sonra bir döngü içinde olanların her işe yarayabilir. Bu bir XHTML belge ve iyi biçimlendirilmiş varsayarak ise, bu yaklaşım makul görünüyor beri.

Eğer arka uç CGI modunda çalıştırın eğer PHP'nin preg_replace_all() oldukça hızlı yapacağız. Neden tüm HTMLs işlemek için bazen php komut dosyası çalıştırmak için cronjob kullanmıyor? Peki, sonra önyüz php-script sadece herhangi bir hesaplama olmadan tarayıcı işlenmiş içeriği koyacağız.

Ben birkaç yıl önce bu sorunla karşılaştı ve adresler bu utm değişkenlerin tüm örneklerini değiştirmek için aşağıdaki regex ile geldi:

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

Örnek bir kullanım:

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');

Ben deneyim hakkında blogged here

Gerçekten bir RegExp ama (test değil) size yardımcı olabilir:

$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;