Toon posts:

[php/regexp] undo htmlspecialchars binnen [html]

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik ben bezig met het maken van de content formatting voor een site. In het begin wordt daar htmlspecialchars() gebruikt om alle <,>,&,",' om te zetten.

Vervolgens worden er zaken omgezet zoals [b] naar <b> etc.

Nu wou ik ook een tag invoeren [html] [/html] om toch gewone HMTL code toe te laten. Maar nu lukt het me niet echt om binnen die [html] codes htmlspecialchars() ongedaan te maken.

Wat ik had:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// If there are [html][/html] blocks
if (preg_match("/[html](.|\n)+?[\/html]/i",$aText,$htmlBlock)) {
    //for each block
    for ($i=1;$i<count($htmlBlock);$i++) {
        // undo htmlspecialchars()
        $htmlBlock[$i] = str_replace("&lt;","<",$htmlBlock[$i]);
        $htmlBlock[$i] = str_replace("&gt;",">",$htmlBlock[$i]);
        $htmlBlock[$i] = str_replace("&amp;","&",$htmlBlock[$i]);
        $htmlBlock[$i] = str_replace("&quot;","\"",$htmlBlock[$i]);
        $htmlBlock[$i] = str_replace("'","'",$htmlBlock[$i]);
        //remove [html] and [/html] tags
        //$htmlBlock[$i] = str_replace("[html]","",$htmlBlock[$i]);
        //$htmlBlock[$i] = str_replace("[/html]","",$htmlBlock[$i]);        
    
        //replace the old code with the new
        $aText = preg_replace("/[html](.|/n)+?\\[\/html]/i",$htmlBlock[$i],$aText);
    }
}

maar dat lukt niet. De pagina blijft eindeloos laden... waar zit het mis? als ik de for loop tussen commentaar zet gaat het sneller, maar worden de [html] blocks gewoon weggelaten.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

kijk eens wat count($htmlBlock) oplevert?

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
Op zondag 23 december 2001 16:16 schreef D2k het volgende:
kijk eens wat count($htmlBlock) oplevert?
dat gaf twee. De input is trouwens
...
[html]blaat<p><b>HTML is cool</b>[/html]

gewoon stukje [color=00FF00]tekst [/color]

[html]<i>terug</i> HTML!!!![/html]
...
Er zitten dus twee [html] blocks in. Ik had echter gelezen dat $htmlBlock[0] de hele match geeft, en dan vanaf 1 enzo de opgesplitste.. :?

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

geen id

doe eens
echo "<pre>";
print_r($html_block);
echo "</pre>";

dan zie je wat erin staat

Doet iets met Cloud (MS/IBM)


Verwijderd

Is het geen idee om eerst alles tussen de [html][/html] blocks te parsen en daarna pas alles wat niet tussen de blocks staat te specialcharren. (Pas natuurlijk wel op, als iemand <script> tags gebruikt etc moet ie er dat wel uithalen!).

Verwijderd

Topicstarter
Op zondag 23 december 2001 16:23 schreef D2k het volgende:
geen id

doe eens
echo "<pre>";
print_r($html_block);
echo "</pre>";

dan zie je wat erin staat
heel raar:
Array
(
[0] => ho want
[1] => n
)
Helemaal bovenaan in de input staat:
Everybody who wants to build a good website needs to know some <HTML>. HTML stands for HyperText Markup Language.
daar heeft hij blijkbaar die "ho want" vandaan, maar waarom??

Verwijderd

Topicstarter
Op zondag 23 december 2001 16:30 schreef daniel_hoenderdos het volgende:
Is het geen idee om eerst alles tussen de [html][/html] blocks te parsen en daarna pas alles wat niet tussen de blocks staat te specialcharren. (Pas natuurlijk wel op, als iemand <script> tags gebruikt etc moet ie er dat wel uithalen!).
mij maakt het niet echt uit in welke volgorde, maar andersom zou ik ook niet weten hoe...

  • BobDay
  • Registratie: December 2001
  • Laatst online: 11-08-2025
Mocht het niet werken doordat de UBB-code het verklooit, mail me dan.
Dan stuur ik het als een tekst bestandje.

<?PHP
function NaarHTML($htmlBlock){

// undo htmlspecialchars()
$htmlBlock = str_replace( "<", "<",$htmlBlock );
$htmlBlock = str_replace( ">", ">",$htmlBlock );
$htmlBlock = str_replace( "&", "&",$htmlBlock );
$htmlBlock = str_replace( """, "\"",$htmlBlock );
$htmlBlock = str_replace( "'", "'",$htmlBlock );

return $htmlBlock;
}

$aText = <<<EOD
[html]blaat<p><b>HTML is cool</b>[/html]
gewoon stukje [color=00FF00]tekst [/color]

[html]<i>terug</i> HTML!!!![/html]
EOD;

$aText = htmlspecialchars($aText);

$aText = preg_replace("!\\[html\](.*?)\\[/html\]!e", "NaarHTML('\\1')", $aText);

echo $aText = nl2br($aText);
?>

43% of all statistics are worthless


Verwijderd

Topicstarter
woei, thanks BobDay, het werkt :)

edit: nog een vraagje, met preg heb ik al drie methodes gezien: met !, met / en met _. Maakt het niet uit welke je gebruikt?

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op zondag 23 december 2001 20:30 schreef Jppr het volgende:
woei, thanks BobDay, het werkt :)

edit: nog een vraagje, met preg heb ik al drie methodes gezien: met !, met / en met _. Maakt het niet uit welke je gebruikt?
nee, maakt niet uit.. zolang je delimiter (zo heten de twee tekens die een regex omsluiten) maar niet in de regex staan.. of je moet ze escapen met een \
Pagina: 1