Autor | Zpráva | ||
---|---|---|---|
lachim15 Profil |
#1 · Zasláno: 21. 3. 2014, 16:56:44
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"e=".$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"e=".$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 |
#3 · Zasláno: 21. 3. 2014, 17:03:26
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 |
#4 · Zasláno: 21. 3. 2014, 17:06:28
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 |
#5 · Zasláno: 21. 3. 2014, 17:10:18
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 * |
#6 · Zasláno: 21. 3. 2014, 17:20:32
Na toto jsou samotne regularni vyrazy kratke. Musíš ten text zpracovat manuálně.
|
||
lachim15 Profil |
#7 · Zasláno: 21. 3. 2014, 17:24:23
Aha, můžete mi prosím uvést nějaký příklad pro inspiraci, jak to myslíte manuálně?
|
||
juriad_ Profil * |
#8 · Zasláno: 21. 3. 2014, 17:29:18
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 |
#10 · Zasláno: 21. 3. 2014, 17:33:51
To je zajímavé, jdu dál studovat, díky za reakce :)
|
||
Kcko Profil |
#11 · Zasláno: 21. 3. 2014, 18:15:32
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
|
||
Časová prodleva: 10 let
|
0