2012-06-24 10 views
27

BenPreg_replace_callback nasıl kullanılır?

[otsection]Wallpapers[/otsection] 
WALLPAPERS GO HERE 

[otsection]Videos[/otsection] 
VIDEOS GO HERE 

Ne yapmaya çalışıyorum bir html div ile [otsection] etiketleri değiştirmek olduğunu aşağıdaki HTML deyimi var. yakalamak

Yani, örneğin, yukarıdaki deyimi I kadarıyla

<div class="otsection" id="1">Wallpapers</div> 
WALLPAPERS GO HERE 

<div class="otsection" id="2">Videos</div> 
VIDEOS GO HERE 

için tercüme edilmelidir .. ben 1-> 2-> 3, vs den div id artırmak istediğiniz olduğu araştırabilir, bunu yapmanın en iyi yolu, her bir değiştirme arasındaki id değişkenini arttırmak için bir preg_replace_callback aracıdır. Ama bunun üzerine 1 saat çalıştıktan sonra, çalışmayı başaramıyorum.

Bu konuda herhangi bir yardım çok takdir edilecektir! Aşağıdaki

cevap

38

Kullanım: Özellikle

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is", 
    function($m) { 
     static $id = 0; 
     $id++; 
     return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>"; 
    }, 
    $in); 

, ben static değişken kullandığını belirtelim. Bu değişken, işleve yapılan çağrılar boyunca devam eder; bu, her eşleşme için gerçekleşen, işlev çağrıldığında her seferinde artacağı anlamına gelir.

Ayrıca, kimliğe ots kodunu eklediğimi unutmayın. Öğe kimlikleri sayılarla başlamamalıdır. PHP için


5,3 öncesi:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is", 
    create_function('$m',' 
     static $id = 0; 
     $id++; 
     return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>"; 
    '), 
    $in); 
+0

"$ in" nesnelere nasıl sahip olabilirsiniz? –

+0

@SheikhHeera Bu zaten orada olmalıydı. Verilerin içeri girip çıktığı yeri göstermek için genellikle $ in 've' $ out 'işlevlerini kullanırım. –

+0

Neyse, güzel cevap. –

22

Not: Genel cevabı olması amaçlanmıştır takip ederek zaten addressed before olduğu gibi OP'ın belirli bir sorunu çözmek için denemez .

preg_replace_callback() nedir?

Bu işlev, düzenli bir ifade arama ve değiştirme işlemi gerçekleştirmek için kullanılır. str_replace()'a benzer, ancak düz dizeler yerine, kullanıcı tanımlı bir regex deseni arar ve eşleştirilen öğeler üzerinde geri arama işlevini uygular. Eşleşme bulunursa değiştirilen dizgeyi değiştirir, aksi halde değiştirilmemiş dizge.

Ne zaman kullanmalıyım?

preg_replace_callback()preg_replace() çok benzer - tek fark yerine ikinci parametre için bir yedek dizesini belirleme, bir callback fonksiyonunu belirtmek olmasıdır.

Basit bir regex araması yapmak ve değiştirmek istediğinizde preg_replace() kullanın. Değiştirmekten daha fazlasını yapmak istediğinizde preg_replace_callback() kullanın. Nasıl çalıştığını anlamak için aşağıdaki örneğe bakın.

Nasıl kullanılır?

İşlevin kullanımını göstermek için bir örnek. Burada, YYYY-MM-DD biçimindeki bir tarih dizesini DD-MM-YYYY'a dönüştürmeye çalışıyoruz.9 (\d karakter sınıfına [0-9] için kısa temsilidir) - N0 arasında değişen bir rakam nerede olabileceğini

// our date string 
$string = '2014-02-22'; 

// search pattern 
$pattern = '~(\d{4})-(\d{2})-(\d{2})~'; 

// the function call 
$result = preg_replace_callback($pattern, 'callback', $string); 

// the callback function 
function callback ($matches) { 
    print_r($matches); 
    return $matches[3].'-'.$matches[2].'-'.$matches[1]; 
} 

echo $result; 

Burada bizim düzenli ifade deseni biçiminde NNNN-NN-NN bir tarih dizesi arar. Geri arama işlevi, verilen dizede eşlenmiş öğeler dizisini çağırır ve iletir.

nihai sonucu olacaktır:

22-02-2014 

Not: Yukarıdaki örnek örnekleme amaçlıdır. , tarihleri ​​ayrıştırmak için kullanmamalısınız. Bunun yerine DateTime::createFromFormat() ve DateTime::format() kullanın. This question, daha fazla ayrıntıya sahiptir.