Nasıl başka bir benzersiz bir URL ile bir dize her URL'yi değiştirebilirsiniz?

3 Cevap php

Ben şu var:

$reg[0] = '`<a(\s[^>]*)href="([^"]*)"([^>]*)>`si';
$reg[1] = '`<a(\s[^>]*)href="([^"]*)"([^>]*)>`si';
$replace[0] = '<a$1href="http://www.yahoo.com"$3>';
$replace[1] = '<a$1href="http://www.live.com"$3>';
$string = 'Test <a href="http://www.google.com">Google!!</a>Test <a href="http://www.google.com">Google!!2</a>Test';
echo preg_replace($reg, $replace, $string);

Hangi sonuçlar:

Test <a href="http://www.live.com">Google!!</a>Test <a href="http://www.live.com">Google!!2</a>Test

Ben (fark ilk bağlantıyı olmak) ile sonuna kadar arıyorum:

Test <a href="http://www.yahoo.com">Google!!</a>Test <a href="http://www.live.com">Google!!2</a>Test

Fikir benzersiz bir diğer URL ile bir dize içinde bir bağlantı içinde her URL değiştirmektir. Ben insanların tıkladım ne izlemek istediğiniz bir bülten sistemi için, bu yüzden URL tıklama kaydedildikten sonra onlar gerçek URL'ye yönlendirilir olacak "sahte" bir URL olacak.

3 Cevap

Sorun ilk yerine dize etkili dize yerine ikinci ile birinci değiştirin dizesi üzerine, ikinci arama deseni ile uyumlu olacak olmasıdır.

Onlar (belki ekstra bir HTML özelliği ekleyerek?) Diğer ifade ile yakalanmayın böylece her nasılsa orijinal olanları "değiştirilmiş" bağlantıları ayırt sürece, ben gerçekten {bir tek bu çözebilir sanmıyorum [(0)]} çağrı. Akla gelen (bir kenara normal ifadede farklılaşmadan), olası bir çözüm, her eşleşen URL preg_match_all() , since it will give you an array of matches to work with. You could probably then encode the matched URLs with your tracking URL by iterating over the array and running a str_replace() kullanmak olacaktır.

Ben regexplerde iyi değilim, ama ne yaptığınızı sadece bir iç URL ile dış URL'leri (site / uygulama yani parçası değil) yerine ise o thrus tıklayın ve kullanıcıyı yönlendirme, o zaman kolay olmalıdır izler Sadece dış URL'ler maç olacak regexpi inşa etmek.

Yani etki alanı foo.com, o zaman sadece sadece http://foo.com ile başlayan bir URL içermeyen bir köprüyü maç olacak regexpi oluşturmak gerekiyor diyelim. Dediğim gibi Şimdi, ben regexplerde ile oldukça kötü değilim, ama burada ona benim en iyi bıçak bulunuyor:

$reg[0] = '`<a(\s[^>]*)href="(?!http://foo.com)([^"]*)"([^>]*)>`si';

Edit: If you want to track click-thrus to internal URLs as well, then just replace http://foo.com with the URL of your redirect/tracking page, e.g. http://foo.com/out.php.

Ben sadece bahsettiğimi göstermek için örnek bir senaryo üzerinden yürümek gerekir. Diyelim altında bülten var diyelim:

<h1>Newsletter Name</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lobortis,
ligula <a href="http://bar.com">sed sollicitudin</a> dignissim, lacus dolor
suscipit sapien, <a href="http://foo.com">eget auctor</a> ipsum ligula
non tortor. Quisque sagittis sodales elit. Mauris dictum blandit lacus.
Mauris consequat <a href="http://last.fm">laoreet lacus</a>.</p>

Bu egzersiz amacıyla, arama deseni olacaktır:

// Only match links that don't begin with: http://foo.com/out.php
`<a(\s[^>]*)href="(?!http://foo.com/out\.php)([^"]*)"([^>]*)>`si

Bu sıradanifade 3 bölüme ayrılabilir:

  1. <a(\s[^>]*)href="
  2. (?!http://foo.com/out\.php)([^"]*)
  3. "([^>]*)>

Arama ilk geçişte, komut inceleyeceğiz:

<a href="http://bar.com">

Bu bağlantı tatmin regexp tüm 3 bileşenleri, bu nedenle URL veritabanında depolanır ile değiştirilir http://foo.com/out.php?id=1.

Arama ikinci geçişte, komut inceleyeceğiz:

<a href="http://foo.com/out.php?id=1">

Bu bağlantı 1 ve 3 ile eşleşir ancak 2 So arama sonraki bağlantıya hareket edecek.:

<a href="http://foo.com">

Bu bağlantı tatmin regexp tüm 3 bileşenleri, bu nedenle URL veritabanında depolanır ile değiştirilir http://foo.com/out.php?id=2.

Arama 3. geçişte, komut, ilk 2 (zaten değiştirildi) bağlantıları incelemek onları atlamak ve daha sonra bülten son halkası ile bir maç bulabilirsiniz.

PHP sadece yerinde bir işlev oluşturabilirsiniz 5.3 kadar, create_function (ki nefret ediyorum) ya da bir yardımcı sınıf ya da kullanmak zorunda.

/**
 * For retrieving a new string from a list.
 */
class StringRotation {
    var $i = -1;
    var $strings = array();

    function addString($string) {
    	$this->strings[] = $string;
    }

    /**
     * Use sprintf to produce result string
     * Rotates forward
     * @param array $params the string params to insert
     * @return string
     * @uses StringRotation::getNext()
     */
    function parseString($params) {
    	$string = $this->getNext();
    	array_unshift($params, $string);
    	return call_user_func_array('sprintf', $params);
    }

    function getNext() {
    	$this->i++;
    	$t = count($this->strings);
    	if ($this->i > $t) {
    		$this->i = 0;
    	}
    	return $this->strings[$this->i];
    }

    function resetPointer() {
    	$this->i = -1;
    }
}

$reg = '`<a(\s[^>]*)href="([^"]*)"([^>]*)>`si';
$replaceLinks[0] = '<a%2$shref="http://www.yahoo.com"%4$s>';
$replaceLinks[1] = '<a%2$shref="http://www.live.com"%4$s>';

$string = 'Test <a href="http://www.google.com">Google!!</a>Test <a href="http://www.google.com">Google!!2</a>Test';

$linkReplace = new StringRotation();
foreach ($replaceLinks as $replaceLink) {
    $linkReplace->addString($replaceLink);
}

echo preg_replace_callback($reg, array($linkReplace, 'parseString'), $string);