Een spoiler BBcode
Voor in Joomla! heb ik een spoiler BB-Code geschreven. Nou Zit er schijnbaar ergens een fout in, ik kan alleen maar niet ontdekken waar ;s Misschien dat iemand mij hiermee kan helpen?
Wat er fout gaat is dat hij ergens in mijn loopje blijft hangen. Als ik bijvoorbeeld 3 spoilers heb, dan krijgt de eerste spoiler de div "spoiler0", de tweede "spoiler1" maar om een of andere reden de derde spoiler ook "spoiler1" in plaats van "spoiler2". Ik heb gekeken of er iets mis was met de loop maar als ik echo $i; neerzet telt hij prima door.
Dit is de functie:
http://pastebin.com/VL2bSnap
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
protected function _process(&$row, &$matches, $count, $regex, $style)
{
for ($i = 0; $i < $count; $i++) {
echo $i . '<br />'; // Deze werkt helemaal prima, en telt gewoon door.
$load = str_replace('[spoiler=\'', "<div style=\"text-transform: uppercase; border-bottom: 1px solid #CCCCCC; margin-bottom: 3px; font-size: 0.8em; font-weight: bold; display: block;\">
<span onclick=\"if (document.getElementById('spoiler" . $i . "').style.display == 'none') {
document.getElementById('spoiler" . $i . "').style.display = 'block';
} else {
document.getElementById('spoiler" . $i . "').style.display = 'none';
}\" /><a href=\"#\" onclick=\"return false;\">"
, $matches[0][$i]);
$load = str_replace('\']', "</a></span></div><div id=\"spoiler" . $i . "\" style=\"display: none;\">", $load);
$load = str_replace('[/spoiler]', '</div>', $load);
$row->text = preg_replace('{' . preg_quote($matches[0][$i]) . '}', $load, $row->text);
}
}
?>
protected function _process(&$row, &$matches, $count, $regex, $style)
{
for ($i = 0; $i < $count; $i++) {
echo $i . '<br />'; // Deze werkt helemaal prima, en telt gewoon door.
$load = str_replace('[spoiler=\'', "<div style=\"text-transform: uppercase; border-bottom: 1px solid #CCCCCC; margin-bottom: 3px; font-size: 0.8em; font-weight: bold; display: block;\">
<span onclick=\"if (document.getElementById('spoiler" . $i . "').style.display == 'none') {
document.getElementById('spoiler" . $i . "').style.display = 'block';
} else {
document.getElementById('spoiler" . $i . "').style.display = 'none';
}\" /><a href=\"#\" onclick=\"return false;\">"
, $matches[0][$i]);
$load = str_replace('\']', "</a></span></div><div id=\"spoiler" . $i . "\" style=\"display: none;\">", $load);
$load = str_replace('[/spoiler]', '</div>', $load);
$row->text = preg_replace('{' . preg_quote($matches[0][$i]) . '}', $load, $row->text);
}
}
?>
Iemand enig idee waar de fout zit?
Bij voorbaat dank!
Jyy
Gewijzigd op 23/01/2012 09:00:12 door Kees Schepers
Kun je het misschien tussen code tags zetten in plaats van in een quote?
Gewijzigd op 23/01/2012 09:02:28 door kees Schepers
nee, het cijfer blijft hangen. In mijn str_replace() print ik een paar keer $i; in de eerste keer in de loop wordt het netjes de 0, de tweede keer een 1 maar elke keer daarna als dus de $i een 4 is bijvoorbeeld, komt er in mijn str_replace() alsnog een 1 wanneer mijn $i erin staat ;s
Gewijzigd op 23/01/2012 13:47:37 door Erwin H
Code (php)
1
2
3
4
5
6
2
3
4
5
6
// expression to search for
$regex = "/\[spoiler='((\s|.)+?)'\]((\s|.)+?)\[\/spoiler\]/";
preg_match_all( $regex, $row->text, $matches );
$count = count( $matches[0] );
$regex = "/\[spoiler='((\s|.)+?)'\]((\s|.)+?)\[\/spoiler\]/";
preg_match_all( $regex, $row->text, $matches );
$count = count( $matches[0] );
Weet je Erwin, het gaat misschien heel bijzonder op je overkomen, maar heel erg bedankt! Wat de functie doet, is, hij neemt alle spoilercodes(dus de [spoiler=''] codes, met preg_match_all()), bewerkt deze naar een echte spoiler (zie hierboven) en plaatst ze dan terug (de laatste regel). Omdat ik testte met allemaal precies dezelfde stukjes tekst in de spoiler, verving hij ze dus allemaal op het einde (ongeveer). Ver verschillende teksten doet hij het.
Hoe ik dat laatste foutje kan fixen zie ik zo-even niet, maar ik weet ook niet of dat wel nodig is (:
Gewijzigd op 23/01/2012 15:17:27 door Jyy An
Jyy An op 23/01/2012 15:16:55:
Weet je Erwin, het gaat misschien heel bijzonder op je overkomen, maar heel erg bedankt!
Nou nee :-)
Dit is de beste les die mijn moeder me ooit heeft geleerd. Ze snapte de ballen niet van wiskunde, maar als ik ooit ergens mee zat hoefde ze me alleen maar te vragen om het uit te leggen. Na de uitleg begreep zij het nog steeds niet, maar was mijn probleem opgelost :-)
Ennuh, ik begrijp je probleem ook nog steeds niet helemaal, maar als het is opgelost maakt dat dus ook niet meer uit....
stap 1: preg_match, vind de bbcode
stap 2: bewerk wat je gevonden hebt
stap 3: verander wat je in stap 1 gevonden hebt, met wat je er in stap 2 van gemaakt hebt.
Maar als je in stap 1 3x exact hetzelfde vindt, weet hij in stap 3 niet welke van de 3 stukjes code je op dat moment bewerkt hebt en welke hij dus precies moet vervangen.
Anyways, ik heb nog 1 klein vraagje, met betrekking tot preg_match.
Ik wil dat hij wél triggert als hij zoiets ziet:
[spoiler='titel']Tekst! [/spoiler]
maar níét als hij zoiets ziet:
[spoiler='titel' group='5']Tekst! [/spoiler]
En andersom, maar dat is een stuk makkelijker (:
Ik ben geen regular expression expert (verre van), maar kan je dan niet het aantal ' tellen? bij 2 wel, bij meer dan 2 niet?
Edit: Maar misschien zou ik inderdaad een tweede preg_match kunnen zetten...?
Edit2: Gefixt, nu zit ik met het volgende probleem... Maar hier post ik wel een nieuw thread voor, het is overigens geen php probleem...
In ieder geval heel erg bedankt iedereen!
Gewijzigd op 23/01/2012 18:12:15 door Jyy An