PHP) (patlayabilir sınırlayıcı bulmak değil

2 Cevap php

Ben böyle bbcode etiketleri ayrıştırmak gereken bir blog inşa ediyorum:

Input: <youtube=http://www.youtube.com/watch?v=VIDEO_ID&feature=channel>
Output:

<object width="400" height="245">
<param name="movie" value="http://www.youtube-    nocookie.com/v/VIDEO_ID&hl=en&fs=1&rel=0&showinfo=0"></param>
<param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param>
<embed src="http://www.youtube-nocookie.com/v/VIDEO_ID&hl=en&fs=1&rel=0&showinfo=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="245"></embed>
</object>

Ben kolay kısmı sıkışmış kazanılmış ettik, çünkü benim işlevi, bugüne kadar son derece basittir! Şu anda, ben fark işlem işlevlerini çağıran bir ana süreç işlevi var. Bu durumda, bir tanesi processYouTubeVideos () 'dir. Ben şöyle diyorum:

$str = eregi_replace('\<youtube=([^>]*)\>', processYouTubeVideos("\\1"), $str);

processYouTubeVideos () mükemmel youtube etiketinin içinde gelen URL'leri alır, ama) (veya bölünmüş) (patlayabilir kullanırken nedense, sınırlayıcı asla bulunamadı. Hatta "u" ya da "tüp" gibi test değerleri kullanarak ...

function processYouTubeVideos ($str) {

    $params = explode("?", $str);
    $params = explode("&", $params[1]);

    return $params[0];

}

2 Cevap

Deneyin:

$str = preg_replace('/<youtube=([^>]*)>/e', 'processYouTubeVideos("$1")', $str);

Çıktı dize işlevi yerine çıkış daha hedef desen çağırdı olacak çünkü çalıştırmak için çalışıyorsanız kod çalışmaz. Yani işleve literarly "\ 1" yolluyoruz demektir. Fonksiyonun başlangıcına var_dump($str); ekleyin ve tekrar kod çalıştırmayı deneyin, ve açıkça bu görürsünüz.

preg_replace Eğer bir yedek yapılan her zaman için bir işlevi yürütmek için kullanabileceğiniz özel bir bayrak "e" vardır. Bu işaretleyici pozisyon (1 $) seviyesinde dizilimi ekleme ve sonra yürütmek ve sonuç almak için kod eval() veya create_function() gibi bir şey çalıştırarak çalışır. Bu daha sonra geri preg_replace() gönderilen ve gerçek değiştirme yapılır.

ProcessYouTubeVideos ("\ 1") fonksiyonu çalıştırmak before eregi_replace ediliyor.

Aşağıdaki Ben niyetinde inanıyorum ne yapar:

$str = eregi_replace('\<youtube=([^>]*)\>', "\\1", $str);
$str = processYouTubeVideos($str);

Bu yerine gerçekleştirir ve daha sonra processYouTubeVideos sonuçtaki değerini gönderir.