[Regex] Quote in quote

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Raoul -

- Raoul -

22/10/2011 20:08:46
Quote Anchor link
Hallo,

Ik heb nu dit script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$input
= preg_replace("#\[quote=(.*?)\](.*?)\[/quote\]#si", "<div class=\"quote\"><strong>Geplaatst door <a href=\"http://\\1.-weggehaald-.nl/\">\\1</a></strong><br />\\2</div>", $input);
?>


Maar als ik nu twee keer een quote doe werkt het al niet meer, weet iemand waarom?
Gewijzigd op 22/10/2011 20:09:05 door - Raoul -
 
PHP hulp

PHP hulp

27/09/2021 00:52:59
 
- Ariën -
Beheerder

- Ariën -

22/10/2011 20:09:29
Quote Anchor link
Wat gebeurt er met de HTML-code dan?
 
- Raoul -

- Raoul -

22/10/2011 20:16:42
Quote Anchor link
Dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<div class="quote">
<strong>Geplaatst door <a href="http://-weg-">-weg-</a></strong>
<br />Nieuwe quote<br />
[quote=-weg-]Hello
</div>
</div>


Terwijl ik heb:

[quote=Raoul]Nieuwe quote
[quote=Raoul]Hello[/quote][/quote]
Gewijzigd op 22/10/2011 20:21:32 door - Raoul -
 
Jacco Brandt

Jacco Brandt

22/10/2011 21:29:38
Quote Anchor link
.*? veranderen in .+?. .+? is non-greedy.
Gewijzigd op 22/10/2011 21:29:46 door Jacco Brandt
 
Jelmer -

Jelmer -

22/10/2011 21:35:36
Quote Anchor link
PHP heeft recursieve regular expressions, wat je in principe nodig hebt. In combinatie met preg_replace_callback zou dat redelijk te doen moeten zijn. Zie voorbeeld 3.
 
- Raoul -

- Raoul -

22/10/2011 22:11:24
Quote Anchor link
Hmm, ik krijg nog steeds een foutmelding.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$input
= preg_replace_callback("#\[quote=(.*?)\](.*?)\[/quote\]#si", "<div class=\"quote\"><strong>Geplaatst door <a href=\"http://\\1.-doei-.nl/\">\\1</a></strong><br />\\2</div>", $input);
?>


'Requires argument 2' Ik heb toch een argument 2?
Gewijzigd op 22/10/2011 22:13:27 door - Raoul -
 
Jelmer -

Jelmer -

23/10/2011 00:27:07
Quote Anchor link
preg_replace_callback slikt een functie als replace-argument. Die functie krijgt dan alle matches die de regexp opleverde en moet dan de replacement-string genereren en teruggeven.
 
- Raoul -

- Raoul -

23/10/2011 09:59:52
Quote Anchor link
Ik snap niks van je uitleg.
 
Jelmer -

Jelmer -

23/10/2011 10:03:53
Quote Anchor link
Lees dan maar de handleiding en kijk nog eens naar het voorbeeld.
 
- Raoul -

- Raoul -

23/10/2011 13:16:31
Quote Anchor link
Alsof ik dat nog niet heb geprobeerd? Ik blijf maar diezelfde error krijgen.
 
Jelmer -

Jelmer -

23/10/2011 15:43:23
Quote Anchor link
preg_replace_callback vindt een stukje dat overeenkomt, roept dan je callback (je 2e parameter voor preg_replace_callback) aan. Deze functie moet dan het vervangende stukje tekst uitrekenen. Dat geeft 'ie terug, en preg_replace_callback zet het dan als vervanging in de tekst terug. Soort van.

De truc is nu om een regular expression te maken die de goeie begin- en end-tag bij elkaar zoekt, en alles wat daartussen zit naar je callback functie stuurt. Die callback functie handelt dat alles wat daartussen zit dan weer af alsof het een nieuw stuk tekst is, en begint dus weer van voor af aan ubb te vervangen. Maar nu niet over het hele document, de hele input, maar alleen over dat kleine stukje tekst dat gepakt werd. Recursief dus.

Of in code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

echo $input = "hallo [quote=a]1 [quote=b]1.1[/quote] [quote=c]1.2 [quote=d]1.2.1[/quote] [/quote] eind 1[/quote] [quote=e]2[/quote]", "\n\n";

function
replace_quote_recursive($input)
{

    return '
        <div class="quote">
            <strong>Geplaatst door <a href="#">'
. htmlspecialchars($input[1]) . '</a></strong><br>
            '
. replace_ubb($input[2]) . '
        </div>
    '
;
}

function
replace_ubb($input)
{

    $input = preg_replace_callback(
        '#\[quote=(.+?)\]((?:[^[]|\[(?!/?quote(?:=(.+?))?\])|(?R))+)\[/quote\]#si',
        'replace_quote_recursive', $input);

    // Als je hier bent is alles wat in $input tussen [quote] en [/quote] stond al
    // eens hier voorbij geweest. Als daar dus [b] in stond, en hier staat code die
    // [b] omschrijft naar <strong>, dan is dat voor die stukken tekst in $input
    // al gebeurd.

    
    return $input;
}


echo replace_ubb($input);
?>


(ik moet toegeven, die regular expression maken die hiervoor nodig was was wat lastiger dan ik in gedachten had)
 
- Raoul -

- Raoul -

23/10/2011 20:50:27
Quote Anchor link
Bedankt voor je reactie.
Het werkt maar er is nog een probleem; in de vorige quote word nu alle html (+ubb) eruit gefilterd dus je ziet nu een lelijke HTML code hoe kan dit?
 
- Raoul -

- Raoul -

25/10/2011 23:06:36
Quote Anchor link
Bump.
Even een afbeelding om de fout duidelijk te maken:
http://i52.tinypic.com/t67348.png
 
Jelmer -

Jelmer -

27/10/2011 23:33:49
Quote Anchor link
Blijkbaar escape je alle html ergens in een van die stappen. Het probleem is, zodra je bij dat quote-filter voorbij bent, zit er html in je tekst. En replace_ubb wordt meerdere keren aangeroepen, dus als je daar je html die erin zit eruit filtert, filter je ook de ubb code html eruit.

Als je nu als aller eerste stap, voordat je replace_ubb aanroept (dus ook buiten de functie replace_ubb!) de html eruit filtert, werkt het dan beter?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.