Autor Zpráva
lachim15
Profil
Zdravím, předělávám svůj chat a dělám citaci, kde jsem narazil na jeden problém, funkce preg_replace předělá pouze 1 citaci, ne vícekrát, pokud do kódu tenhle příkaz nevložím vícekrát (podle počtu citací), lze nějak udělat, aby tento příkaz se sám opakoval, popřípadě má někdo lepší řešení? (něco jednoduchého, abych to pochopil, jelikož jsem stále začátečník)

Tady mám tento příkaz pouze jednou:
http://nemesisup.cz/files/541/1-1024.jpg
Jedná se o část kódu:
 $obj->text = preg_replace("#\[quote\](.+?)\[/quote\]#is", "<div class='quote'>\\1</div>", $obj->text);

Kód pro výpis z databáze:
<?php
require_once('Pager.class.php');
$pager = new Pager('SELECT * FROM chat order by id desc', 'page');
$pager->PageSize = 15;
$pager->PagerAlign = "center";
$pager->DataBind();
while ($obj = $pager->GetOne())
{
    $obj->text = htmlspecialchars_decode($obj->text);
    $obj->nick = htmlspecialchars_decode($obj->nick);
    $obj->text = preg_replace("#\[b\](.+?)\[/b\]#is", "<b>\\1</b>", $obj->text);
    $obj->text = preg_replace("#\[i\](.+?)\[/i\]#is", "<i>\\1</i>", $obj->text);
    $obj->text = preg_replace("#\[u\](.+?)\[/u\]#is", "<u>\\1</u>", $obj->text);
    $obj->text = preg_replace("#\[quote\](.+?)\[/quote\]#is", "<div class='quote'>\\1</div>", $obj->text);
    $obj->text = preg_replace("#\[br\]#is", "<br>\\1", $obj->text);
    $obj->text = preg_replace("#\[url\](.+?)\[/url\]#is", "<a href='\\1' target='blank'>\\1</a>", $obj->text);
    $obj->text = preg_replace("#\[s1\]#is", "<img src='obrazky/s1.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s2\]#is", "<img src='obrazky/s2.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s3\]#is", "<img src='obrazky/s3.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s4\]#is", "<img src='obrazky/s4.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s5\]#is", "<img src='obrazky/s5.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s6\]#is", "<img src='obrazky/s6.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s7\]#is", "<img src='obrazky/s7.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s8\]#is", "<img src='obrazky/s8.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s9\]#is", "<img src='obrazky/s9.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s10\]#is", "<img src='obrazky/s10.png' alt='smajlik'>", $obj->text);
    $obj->nick = preg_replace("#lachim16#is", "<span class='blue'>lachim16</span>", $obj->nick);
    $obj->nick = preg_replace("#lachim14#is", "<span class='blue'>lachim14</span>", $obj->nick);
    $obj->id = ($obj->id);
    $obj->datumedit = ($obj->datumedit);
    $obj->textedit = ($obj->textedit);
    
  echo "<div class='ramecek'>";
  echo "<div class='ramecek2'><span class='chatjmeno'>".$obj->nick."</span> | <span class='chatdatum'>". $obj->datum. "</span><a href='index.php?stranka=chat&quote=".$obj->id."' class='chatcitace'><img src='obrazky/quote.png' alt='citovat'></a></div><div class='chattext'>" .$obj->text."</div>";
  echo "</div>";
  }
echo "<div id='sipky'>";
$firstLastMode = new FirstLastPagerMode();
$pager->AddPagerMode($firstLastMode);
$prevNextMode = new PrevNextPagerMode();
$pager->AddPagerMode($prevNextMode);
$neighbourMode = new NeighbourPagerMode();
$neighbourMode->NeighbourPagesCount = 2;
$pager->AddPagerMode($neighbourMode);

$pager->DrawPager();
echo "</div>";
?>

Tady pokud přidám požadované opakóvání preg_replace pro citaci (3x):
http://nemesisup.cz/files/541/2-1624.jpg
Ukázka kódu výpisu z databáze:
<?php
require_once('Pager.class.php');
$pager = new Pager('SELECT * FROM chat order by id desc', 'page');
$pager->PageSize = 15;
$pager->PagerAlign = "center";
$pager->DataBind();
while ($obj = $pager->GetOne())
{
    $obj->text = htmlspecialchars_decode($obj->text);
    $obj->nick = htmlspecialchars_decode($obj->nick);
    $obj->text = preg_replace("#\[b\](.+?)\[/b\]#is", "<b>\\1</b>", $obj->text);
    $obj->text = preg_replace("#\[i\](.+?)\[/i\]#is", "<i>\\1</i>", $obj->text);
    $obj->text = preg_replace("#\[u\](.+?)\[/u\]#is", "<u>\\1</u>", $obj->text);
    $obj->text = preg_replace("#\[quote\](.+?)\[/quote\]#is", "<div class='quote'>\\1</div>", $obj->text);
    $obj->text = preg_replace("#\[quote\](.+?)\[/quote\]#is", "<div class='quote'>\\1</div>", $obj->text);
    $obj->text = preg_replace("#\[quote\](.+?)\[/quote\]#is", "<div class='quote'>\\1</div>", $obj->text);
    $obj->text = preg_replace("#\[br\]#is", "<br>\\1", $obj->text);
    $obj->text = preg_replace("#\[url\](.+?)\[/url\]#is", "<a href='\\1' target='blank'>\\1</a>", $obj->text);
    $obj->text = preg_replace("#\[s1\]#is", "<img src='obrazky/s1.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s2\]#is", "<img src='obrazky/s2.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s3\]#is", "<img src='obrazky/s3.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s4\]#is", "<img src='obrazky/s4.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s5\]#is", "<img src='obrazky/s5.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s6\]#is", "<img src='obrazky/s6.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s7\]#is", "<img src='obrazky/s7.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s8\]#is", "<img src='obrazky/s8.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s9\]#is", "<img src='obrazky/s9.png' alt='smajlik'>", $obj->text);
    $obj->text = preg_replace("#\[s10\]#is", "<img src='obrazky/s10.png' alt='smajlik'>", $obj->text);
    $obj->nick = preg_replace("#lachim16#is", "<span class='blue'>lachim16</span>", $obj->nick);
    $obj->nick = preg_replace("#lachim14#is", "<span class='blue'>lachim14</span>", $obj->nick);
    $obj->id = ($obj->id);
    $obj->datumedit = ($obj->datumedit);
    $obj->textedit = ($obj->textedit);
    
  echo "<div class='ramecek'>";
  echo "<div class='ramecek2'><span class='chatjmeno'>".$obj->nick."</span> | <span class='chatdatum'>". $obj->datum. "</span><a href='index.php?stranka=chat&quote=".$obj->id."' class='chatcitace'><img src='obrazky/quote.png' alt='citovat'></a></div><div class='chattext'>" .$obj->text."</div>";
  echo "</div>";
  }
echo "<div id='sipky'>";
$firstLastMode = new FirstLastPagerMode();
$pager->AddPagerMode($firstLastMode);
$prevNextMode = new PrevNextPagerMode();
$pager->AddPagerMode($prevNextMode);
$neighbourMode = new NeighbourPagerMode();
$neighbourMode->NeighbourPagesCount = 2;
$pager->AddPagerMode($neighbourMode);

$pager->DrawPager();
echo "</div>";
?>
Fisir
Profil
Reaguji na lachima15:
Přidej flag g:
preg_replace("#\[quote\](.+?)\[/quote\]#isg", "<div class='quote'>\\1</div>", $obj->text);
lachim15
Profil
Bohužel nefunguje :/

( ! ) SCREAM: Error suppression ignored for
( ! ) Warning: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: Unknown modifier 'g' in C:\wamp\www\***\stranky\chat.php on line 137
Fisir
Profil
Reaguji na lachima15:
Pak asi neporadím, pokud totiž není specifikovaný limit, tak preg_replace nahrazuje všechny shody. Jsi si jistý, že ty ostatní odpovídají regulárnímu výrazu?
lachim15
Profil
Tohle je výpis z databáze, výrazy odpovídají, ani se nekříží.

[quote]treti uroven napsal dne: 21.03.2014 v 15:40[br][quote]Druha úroven napsal dne: 21.03.2014 v 15:40[br][quote]prvni uroven napsal dne: 21.03.2014 v 15:39[br]1[/quote]2[/quote]3[/quote]4
juriad_
Profil *
Na toto jsou samotne regularni vyrazy kratke. Musíš ten text zpracovat manuálně.
lachim15
Profil
Aha, můžete mi prosím uvést nějaký příklad pro inspiraci, jak to myslíte manuálně?
juriad_
Profil *
Pokud by šlo napsat regularni vyraz zachycujici jen ten nejvnitrnejsi, tak by replace slo iterovat smyckou while, dokud se text meni.
Jinak bych asi quote programove zmenil na quote1, quote2 atd. Tak aby kazda uroven, pripadne kazdy qote mel jine cislo. Toto by mohlo jit replacem s callbackem.
A nasledne provest klasicky replace ve smycce pro vsechny ocislovane quote.
Tori
Profil
Různé možnosti pro vnořené tagy jsou tady: Převod vnořených bbCode značek do HTML. (Jsou to různé variace té první z juriadem popsaných možností.)
lachim15
Profil
To je zajímavé, jdu dál studovat, díky za reakce :)
Kcko
Profil
lachim15:
Takhle nějak?

<?php


function _quote($str)
{
    if( preg_match('#\[quote\](.*)\[/quote\]#si', $str) )
         return _quote(preg_replace('#\[quote\](.*)\[/quote\]#si', '<div style="border: 1px solid red; margin: 1em;">$1</div>', $str));
    return preg_replace('#\[quote\](.*)\[/quote\]#si', '<div style="border: 1px solid red; margin: 1em;">$1</div>', $str);
}

$str="[quote]prvni  [quote]druhy [quote]treti[/quote][/quote] [/quote]";

echo _quote($str);
lachim15
Profil
Funguje luxusně, přesně to co jsem potřeboval :) díky

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: