Archief - PHP: bbcode probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Black Night

Legacy Member
llo :)

Ik gebruik op Stopsein.net bij verschillende scripts BBcode. Nu is mijn probleem het volgende:

Indien iemand een andere post wil quoten, vormt het script automatisch de quote om naar <div class="bbcode_quote">tekst</div>. Maar vanaf dar er een quote in een quote voorkomt, wil het script de 2e quote niet meer parsen in html-tags.

Ik gebruik 2 arrays:
- $bbcode is een array met alle bbcode-tags
- $bbcode_out is een array met alle html-tags die tegenover de bbcode-tags staan.

Het bericht wordt uiteindelijk geparsed door een preg_replace:
$message = preg_replace($bbcode, $bbcode_out, $message);


Een omslachtige oplossing is de preg_replace zoveel keer te laten uitvoeren als er quotes in quotes voorkomen. Dit is echter nogal omslachtig.

Iemand een oplossing?

Thx!

Black Night

Legacy Member
ik heb reeds volgende code toegevoegd:

PHP:
	$prev_message = "";
	while ($prev_message != $message) {
		$prev_message = $message;
		$message = preg_replace($bbcode, $bbcode_out , $message);
	}

vrij omslachtig, maar het werkt deftig.

Iemand betere ideeen?

killgore

Legacy Member
zorg dat je patterns zeker en vast ungreedy werken :) (kan door vanachter U als modifier te zetten of expliciete zaken zoals *?).

Radiance

Legacy Member
PHP:
$prev_message = "";
    while ($prev_message != $message) {
        $prev_message = $message;
        $message = preg_replace($bbcode, $bbcode_out , $message);
    }

Nu snap ik toch even niet wat hier het nut van kan zijn?
$message = preg_replace($bbcode, $bbcode_out , $message);

wordt toch sowieso maar één keer uitgevoerd hier, lijkt mij?

killgore

Legacy Member
Radiance zei:
PHP:
$prev_message = "";
    while ($prev_message != $message) {
        $prev_message = $message;
        $message = preg_replace($bbcode, $bbcode_out , $message);
    }

Nu snap ik toch even niet wat hier het nut van kan zijn?
$message = preg_replace($bbcode, $bbcode_out , $message);

wordt toch sowieso maar één keer uitgevoerd hier, lijkt mij?
kijk beter :p

hij schrijft dat ze niet gelijk zijn, dus:

stap 1: prev_message is leeg, en we veronderstellen message niet leeg, dus niet gelijk, while wordt uitgevoerd:
prev message wordt op gewoon message gezet, message wordt geparsed en dus niet meer gelijk aan prev message ;).
Dit blijft doorgaan tot er geen parsen meer aan is :p.

edit: bekijk ook eens preg_replace_callback ;).

Black Night

Legacy Member
Bedankt voor de reacties!

Mijn patterns werken ungreedy, dus daar kan ik niet veel meer aan veranderen. En de preg_replace_callback ziet er angstaanjagend raar uitgelegd uit op php.net :/. Effe eens testen met die functie :)

De while-lus werkt inderdaad zoals Killgore het zei ;)

Radiance

Legacy Member
killgore zei:
kijk beter :p

hij schrijft dat ze niet gelijk zijn, dus:

stap 1: prev_message is leeg, en we veronderstellen message niet leeg, dus niet gelijk, while wordt uitgevoerd:
prev message wordt op gewoon message gezet, message wordt geparsed en dus niet meer gelijk aan prev message ;).
Dit blijft doorgaan tot er geen parsen meer aan is :p.

edit: bekijk ook eens preg_replace_callback ;).
Ja wat dat doet snap ik nog wel (denk ik dan toch :p ). Maar preg_replace vervangt toch oneindig veel elementen in één keer, na één aanroep is alles wat vervangen hoort te worden toch vervangen?
Hij doorloopt de while nu 2x, één keer teveel, of mis ik iets?

waarschijnlijk maak k mij hiermee onsterfelijk belachelijk, maar bon,moet het toch weten ;)

Black Night

Legacy Member
Radiance zei:
Ja wat dat doet snap ik nog wel (denk ik dan toch :p ). Maar preg_replace vervangt toch oneindig veel elementen in één keer, na één aanroep is alles wat vervangen hoort te worden toch vervangen?
Hij doorloopt de while nu 2x, één keer teveel, of mis ik iets?

waarschijnlijk maak k mij hiermee onsterfelijk belachelijk, maar bon,moet het toch weten ;)

Ik dacht dat ook, maar blijkbaar kan een element in een element niet direct geparsed worden, bijvoorbeeld een quote in een quote

en btw: er zijn geen domme vragen, alleen domme antwoorden :)


*edit*

PHP:
[QUOTE]test[QUOTE]test2[/QUOTE][/QUOTE]

wordt:

test [ QUOTE ] test2
[ /QUOTE ]

dan zonder spaties :p

Radiance

Legacy Member
Ah, maar nu heb k em, ik ging er vanuit dat je [QUOTE ] & [/QUOTE ] als 2 onafhankelijke patterns zag in uw array (nu k er zo over denk niet bepaald een goeie oplossing als ge uw layout in wilt laten verkloten ma bon).

Nu snap k waarom het nodig is :) Thanks

Black Night

Legacy Member
Radiance zei:
Ah, maar nu heb k em, ik ging er vanuit dat je [QUOTE ] & [/QUOTE ] als 2 onafhankelijke patterns zag in uw array (nu k er zo over denk niet bepaald een goeie oplossing als ge uw layout in wilt laten verkloten ma bon).

Nu snap k waarom het nodig is :) Thanks

NP :)

orez

Legacy Member
Ik gebruik dit in mn ubb script... works perfect quote in quote. Mss ben je er iets mee

PHP:
// de [quote] tags...
        $input = str_replace("[quote]", "<div id=\"quote\">", $input); 
        $input = str_replace("[/quote]", "</div>", $input); 
        $input = preg_replace('!\[quote=((\w)*?)\]!', "<div id=\"quote\"><span class=\"quote\">Quote from: \\1</span><br />", $input);

Black Night

Legacy Member
idd, die methode vind ik niet echt de beste methode (tenzij je de start-div's gaat tellen en evenveel eind-div's gaat toevoegen, en dan nog...) :s

killgore

Legacy Member
ge kunt ook een preg_match_all gaan doen en dan via een replace gaan werken :p. (ma da zou ek eerder aanraden als je met die match all nog veel meer andere zaken kunt doen).

BART_SIMPSON416

Legacy Member
Dit is inderdaat redelijk lastig.
Je kan eigenlijk best met percentages werken in dit geval als ek me niet vergis.
Zodat je breedte van je quote venster 80% of zo is van het element waar het zich in bevindt.

Black Night

Legacy Member
killgore zei:
ge kunt ook een preg_match_all gaan doen en dan via een replace gaan werken :p. (ma da zou ek eerder aanraden als je met die match all nog veel meer andere zaken kunt doen).

ok, bedankt voor de tip.

Ik werk met de preg_replace reeds via arrays zodat 1 preg_replace alle voorkomende bb-tags omvormt. Enkel bij dezelfde bb-tag in een andere bb-tag kreeg ik problemen :s

Nog een vraagje:

Wat zou de meeste parsetime nodig hebben? Uw preg_match_all of een preg_replace in een while-lus :) ?



BART_SIMPSON416 zei:
Dit is inderdaat redelijk lastig.
Je kan eigenlijk best met percentages werken in dit geval als ek me niet vergis.
Zodat je breedte van je quote venster 80% of zo is van het element waar het zich in bevindt.

Over de uitwerking in html-css zijn er geen problemen. Daar hoef ik dus niets aan te veranderen :)

killgore

Legacy Member
Black Night zei:
ok, bedankt voor de tip.

Ik werk met de preg_replace reeds via arrays zodat 1 preg_replace alle voorkomende bb-tags omvormt. Enkel bij dezelfde bb-tag in een andere bb-tag kreeg ik problemen :s

Nog een vraagje:

Wat zou de meeste parsetime nodig hebben? Uw preg_match_all of een preg_replace in een while-lus :) ?

preg_replace volgens mij, na preg_match_all moet je toch nog over results iteraten en een replace functie oproepen (str_replace of preg_replace) en hoewel in documentatie van php staat dat str_replace veel sneller is als preg_replace voor niet-regexes is dit vrij dikke zever (in 1 v/d betas heb ek nog via benchmarks ontdekt dat de preg_replace SNELLER was, nu is str_replace wel weer sneller, maar niet overdreven) ;).
preg replace geloopt zal duidelijk sneller zijn.

Preg_match_all kan bv. voordelen hebben als je zo 4 soorten bb-code hebben die kunnen nesten ;), dan moet je mbv een beetje ingewikkeldere query gaan zoeken en replacen, zal wel sneller gaan :).
Maar dan zal het ook pas vanaf bepaald aantal codes sneller gaan hoor :), tzou kunnen dat je bij 4 soorten nog steeds sneller af bent met 4 lussen.
Nog ander voordel van preg_match_all is dat je code dynamischer is ;).

Maar voor jouw probleem zie ik niet onmiddelijk iets efficiënter als jouw code tussen de huidige oplossingen (hoewel ik het gedacht heb dat ik iets zwaar over het hoofd zie :p, tis al zo lang geleden dak dergelijke dingen heb gemaakt :).

en bart_simpson: leer lezen.

Black Night

Legacy Member
OK, bedankt voor de grote hoeveelheid aan informatie ;)

En echt moeilijk zit de BBcode niet in elkaar. Men kan de volgende BBcode gebruiken:
- Vet, schuin, onderlijnd
- links, center en rechts uitlijnen
- hyperlinks
- emaillinks
- quoten

Smileys worden na de preg_replace dmv een str_replace vervangen

Ik zal mij dus bij die while-lus houden :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan