Bir değişkeni içeren tutucu metni değiştirme

4 Cevap

Merhaba ben böyle CMS benim içeriğinde yer tutucu metin var:

$content = "blah blah blah.. yadda yadda, listen to this:
{mediafile file=audiofile7.mp3}
and whilst your here , check this: {mediafile file=audiofile24.mp3}"

and i need to replace the placeholders with some html to display the swf object to play the mp3.
How do i do a replace that gets the filename from my placeholder.

Ben RegX desen {mediafile file=[A-Za-z0-9_]} olduğunu düşünüyorum ama o zaman nasıl ben bu işaretleri içeren tüm değişken için geçerlidir?

Çok yardımcı olabilecek herkese teşekkürler,

Irade

4 Cevap

Ben aslında seni json_decode ilgili bir işlevi kullanabilirsiniz düşünüyordum, ama dizeleri tırnak içinde sarılmış olması veya json_decode bunları işlemez gerekir. Yani tutucuları yazılı olsaydı:

{"mediafile" : "file" : "blahblah.mp3"}

Eğer json_decode($song, true) için explode($song) kullanarak benim örnek kodunu değiştirmek ve çalışmak için güzel bir anahtarlı bir dizi olabilir.

Her iki şekilde de, ben sadece anlamsız olduğu, html içine bulunan tutucuların örneklerini değiştirmek için temel bir dize işlevini yerine daha sonra tutucuları bulmak için strtok fonksiyonunu kullanarak, ve gitti.

strtok, şimdiye kadar PHP docs gösterdiği gibi, regex kullanmak değildir, bu yüzden bu basit değil sadece olurdu ama aynı zamanda gebelik kitaplığa bir çağrı kaçının.

Son bir şey. Eğer json sözdizimi ile gitmek yaparsanız strtok onun tarafından arıyor belirteçleri kaldırır gibi, sen {} yeniden sarmak tutucuları zorunda kalacak.

<?php
$content = "blah blah blah.. yadda yadda, listen to this:
{mediafile file=audiofile7.mp3}
and whilst your here , check this: {mediafile file=audiofile24.mp3}";

    function song2html($song) {
       $song_info = explode("=", $song);
       $song_url = $song_info[1];
       $song_html = "<object src=\"$song_url\" blahblahblah>blah</object>";
    return ($song_html);
    }

$tok = strtok($content, "{}");

while ($tok !== false) {
    if(strpos($tok, "mediafile") !== false) {
  $songs[] = $tok;
 }
 $tok = strtok("{}");
}

foreach($songs as $asong) {
 $content = str_replace($asong, song2html($asong), $content);
}

echo $content;
?>

İşte preg_replace_all , nasıl çalıştığını göstermek için kullanarak, hızlı bir örnek:

$content bu şekilde beyan edilmesi halinde:

$content = "blah blah blah.. {mediafile file=img.jpg}yadda yadda, listen to this:
{mediafile file=audiofile7.mp3}
and whilst your here , check this: {mediafile file=audiofile24.mp3}";

Böyle bir şey ile tutucuları değiştirebilirsiniz:

$new_content = preg_replace_callback('/\{mediafile(.*?)\}/', 'my_callback', $content);
var_dump($new_content);

Ve geri çağırma işlevi bu gibi görünebilir:

function my_callback($matches) {
    $file_full = trim($matches[1]);
    var_dump($file_full);       // string 'file=audiofile7.mp3' (length=19)
                                // or string 'file=audiofile24.mp3' (length=20)
    $file = str_replace('file=', '', $file_full);
    var_dump($file);            // audiofile7.mp3 or audiofile24.mp3

    if (substr($file, -4) == '.mp3') {
        return '<SWF TAG FOR #' . htmlspecialchars($file) . '#>';
    } else if (substr($file, -4) == '.jpg') {
        return '<img src="' . htmlspecialchars($file) . '" />';
    }
}

Burada, var_dump alacak son:

string 'blah blah blah.. <img src="img.jpg" />yadda yadda, listen to this:
<SWF TAG FOR #audiofile7.mp3#>
and whilst your here , check this: <SWF TAG FOR #audiofile24.mp3#>' (length=164)

Bu :-) yardımcı olur umarım


Don't forget to add checks and all that, of course ! And your callback function will most certainly become a bit more complicated ^^ but this should give you an idea of what is possible.

BTW: Bir anonim işlevi oluşturmak için create_function kullanmak isteyebilirsiniz ... Ama ben bunu sevmiyorum: Eğer şeyler kaçmak için var, orada hiçbir sözdizimi vurgulama in IDE, ... Bu büyük bir kompleks / fonksiyonu ile cehennem.

Dikkatli regex dokümanlar okuyun.

Desen biraz kapalı görünüyor. {Mediafile file = ([^}] +)} aradığınız ne gibi bir cevher olabilir (eğer verdi regex için izin vermiyor ".").

Eğer böyle bir şey yapmak

$content = preg_replace_callback(
        '|{mediafile file='([A-Za-z0-9_.]+)}|',
        create_function(
            // single quotes are essential here,
            // or alternative escape all $ as \$
            '$matches',
            'return "<embed etc ... " . ($matches[1]) ."more tags";'
        ),
        $content
    );

Eğer preg_replace_callback kılavuzuna görebilirsiniz. Normal preg_replace da işe ama dağınık olabilir.