PHP iç içe BBCode'u (tırnak) Çıkarma

0 Cevap php

Ben iç içe benim bülten tahtası alıntı çıkarmak için çalışıyorum, ama bazı sorunlar yaşıyorum.

Example input:

[Quote author = personX link = topic = 12.msg1910 # msg1910 date = 1282745641]

[quote author=PersonY link=topic=12.msg1795#msg1795 date=1282727068]

The message in the original quote

[/ Quote]

İlkini alıntı ikinci bir mesaj

[/ Quote]

[Quote author = PersonZ link = topic = 1.msg1 # msg1 date = 1282533805]

Bir rasgele üçüncü alıntı

[/ Quote]

Example output

[Quote author = personX link = topic = 12.msg1910 # msg1910 date = 1282745641]

Ikinci alıntıda Mesaj

[/ Quote]

[Quote author = PersonZ link = topic = 1.msg1 # msg1 date = 1282533805]

Bir rasgele üçüncü alıntı

[/ Quote]

Gördüğünüz gibi iç içe alıntı (orijinal mesajı) alıntı etiketleri ile birlikte kaldırılır.

Ben bunu anlamaya görünüyor olamaz.

I çalıştığınızda

$toRemove = '(\\[)(quote)(.*?)(\\])';
$string = $txt;
$found = 0; echo preg_replace("/($toRemove)/e", '$found++ ? \'\' : \'$1\'', $string);

Bu, ilki hariç alıntı etiketinin her geçtiği kaldırır

Ama için kod genişletmek zaman:

$toRemove = '(\\[)(quote)(.*?)(\\])(.*?)(\\[\\/quote\\])';
$string = $txt;
$found = 0; echo preg_replace("/($toRemove)/e", '$found++ ? \'\' : \'$1\'', $string); 

Bu hiç bir şey yapıyor durur.

Bu konuda herhangi bir fikir?


Edit:

Yardımlarınız, Haggi için teşekkürler.

Ik olsa sorun olarak çalışmaya devam.

Etrafında while döngüsü

while ( $input = preg_replace_callback( '~\[quoute.*?\[/quote\]~i', 'replace_callback', $input ) ) {
// replace every occurence
}

çıkarıldığında (quoute ekstra u ile birlikte), süresiz döngü sayfa neden olur, sayfa bir şey yapmaz.

Ben neden eşleşen olduğunu tespit ettik

olarak değiştirildi

$input = preg_replace_callback( '/\[quote(.*?)/i', 'replace_callback', $input );

the code does start working, but olarak değiştirildi

$input = preg_replace_callback( '/\[quote(.*?)\[\/quote\]/i', 'replace_callback', $input );

Yine bir şey yapıyor stopts.

Bu saklanan karma bulur asla Ayrıca, undo_replace fonksiyonu ile ilgili bir sorun olduğunu, sadece unfound dizinler hakkında uyarılar verir. Sha1 eşleşen regex sanırım düzgün çalışmıyor.

Ben şimdi olduğu gibi tam kodu:

$cache = array();
$input = $txt;

function replace_callback( $matches ) {
    global $cache;
    $hash = sha1( $matches[0] );
    $cache["hash"] = $matches[0];
    return "REPLACE:$hash";
}



// replace all quotes with placeholders
$input = preg_replace_callback( '/\[quote(.*?)\[quote\]/i', 'replace_callback', $input );

function undo_replace( $matches ) {
    global $cache;
    return $cache[$matches[1]];
}

// restore the outer most quotes
$input = preg_replace_callback( '~REPLACE:[a-f0-9]{40}~i', 'undo_replace', $input );

// remove the references to the inner quotes
$input = preg_replace( '~REPLACE:[a-f0-9]{40}~i', '', $input );

echo $input;

Teşekkürler tekrar herhangi bir fikir çocuklar için :)

0 Cevap