[php] Syntax Highlightning-tag

Pagina: 1
Acties:

Onderwerpen


  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
Ik ben bezig een forum te voorzien van de in /14 zo geliefde [php]-tag maar stuit op een probleem.
Ik heb al gezocht maar hoeveel er ook over te vinden valt, niks werkt. Ik ben al wel een beetje in de buurt gekomen met de volgende code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? 

$message = preg_replace("#\[php](.*?)\[/php]#sie", 'highlight("$1")', $message);

function highlight($input) {
    $input = str_replace("<br />", "", $input);
    
    $output = "<div align=\"left\"><font face=verdana size=1><b>PHP Code:</b></font>";
    $output .= "<table border=\"0\" width=\"480\" bgcolor=\"black\" cellspacing=\"1\" cellpadding=\"3\">";
    $output .= "<tr><td width=\"100%\" bgcolor=\"EEEEEE\">";
    $output .= highlight_string($input,true);
    $output .= "</td></tr></table></div>";
    
    return $output;
 }
?>


Dit werkt redelijk maar nu worden alle variables bij mij weggelaten.
Zo krijg ik bijvoorbeel in plaats van dit:
PHP:
1
2
3
4
<? 
$blaat = "blaat";
echo $blaat; 
?>


dit te zien:

PHP:
1
2
3
4
<? 
 = "blaat";
echo ; 
?>


Ik geef de moed dus nu op om zelf te blijven proberen en hoop dat men mij hier wat verder kan helpen. :)

[ Voor 20% gewijzigd door Maxonic op 19-12-2002 05:17 . Reden: beter voor layout zo ]


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Toverwoord: escapen.

Zoek op www.php.net maar eens naar addcslashes en verwante functies.

[ Voor 71% gewijzigd door Rataplan op 19-12-2002 05:29 . Reden: beetje bs verwijderd :) ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
Nope, sorry. Werkt niet.
De variable blijven verborgen met het gebruik van $message = addcslashes($message,'$');
Zelfs als ik er handmatig nog wat andere slashes voorzet worden de variables (en de slashes) niet weergegeven. Ook als ik middels str_replace() $ door iets anders vervang en deze na de highlight weer terug laat vervangen werkt het niet.

Verwijderd

En als je je php code tussen enkele quotes zet?
Het was toch zo dat echo '$blaat'; als $blaat werd ge-echoed?
Of vergis ik mij hier...

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
code:
1
[php]<? echo "$blaat"; ?>[/php]


wordt bij mij

PHP:
1
<? echo ""; ?>


en

code:
1
[php]<? echo '$blaat'; ?>[/php]


wordt

PHP:
1
<? echo '\'; ?>

Zonder quotes nog steeds helemaal nix.

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Overigens kan je ook gebruik maken van de door ACM gemaakte parser:

http://achelois.tweakers.net/~acm/parse/

[ Voor 12% gewijzigd door ACM op 09-10-2007 22:40 . Reden: vulcanus.its.tudelft.nl is niet meer ]


  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
ja, maar dan is de lol er een beetje van af :)
Ik zal kijken hoe hij het heeft aangepakt maar ben niet van plan die hele parser in m'n forum te dumpen.

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
Ik heb nu mijn functie highlight door die van Arjen vervangen maar blijf precies hetzelfde probleem houden. :/

Het kan niet liggen aan iets wat er voor de functie gebeurt want als ik $input in de functie zelf definieer blijf ik hetzelfde probleem houden. Zelfs deze functie geeft geen variable weer:

PHP:
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
31
function highlight(){

    $input = "< ? echo $blaat; ? >";

    $input = str_replace("<br />", "", $input);
    $input = addcslashes($input,"$");
    $input = trim($input);
    if($input[0] != "<" && $input[1] != "?"){

        $input = "< ?php\n" . $input;
    }
    $chars = strlen($input);
    if($input[$chars-2] != "?" && $input[$chars-1] != ">"){
        $input .= "\n? >"; 
    }
    ob_start();
    @highlight_string($input);
    $outputcode = ob_get_contents();
    ob_end_clean();

    $output  = "<div align=\"left\"><font face=verdana size=1><b>PHP Code:</b></font>";
    $output .= "<table border=\"0\" width=\"480\" bgcolor=\"black\" cellspacing=\"1\" cellpadding=\"3\">";
    $output .= "<tr><td width=\"100%\" bgcolor=\"EEEEEE\">";
    $output .= $outputcode;
    $output .= "</td></tr></table></div>";
    
    return $output;
}

echo highlight();
exit;


In deze code heb ik <? en ?> maar ff van spaties voorzien zodat het een beetje leesbaar is.

Verwijderd

Weet je zeker dat die @ voor higlight_string moet?

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
Dat moet op zich niet veel uitmaken. Is alleen ter onderdrukking van eventuele meldingen die dan in de code zouden komen.
Zonder die @ gebeurt precies hetzelfde.

Verwijderd

Ik heb hiervoor dit ooit eens gebruikt:
PHP:
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
<?php
/**
 * Highlights passed $code (only works in PHP4+)
 * @param $code code to be parsed
 * @return the php code parsed code
 */
function phphighlight($code)
{
   if (floor(phpversion())<4)
      $buffer=$code;
   else
   {
      if (!strstr($code,'<?')) {
         $code="<?php\n".trim($code)."\n?>";
      }
      ob_start();
      $oldlevel=error_reporting(0);
      highlight_string($code);
      error_reporting($oldlevel);
      $buffer = ob_get_contents();
      ob_end_clean();
   }

   return "<b>PHP:</b><hr>$buffer<hr>";
}
?>


Zie je overigens al wel waarom highlight_string() niet werkt op de manier die jij eerst gebruikte?

[ Voor 31% gewijzigd door Verwijderd op 19-12-2002 16:46 . Reden: Schonere code ]


  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
Ja, tis me duidelijk dat ik wel met output buffering moet werken.
Deze funtie werkt trouwens ook niet, of zeg maar, geeft hetzelfde resultaat.

Als ik $input = "<? echo $blaat; ?>"; in Arjen's functie vervang door

code:
1
$input = "<? echo \$blaat; ?>";


Werkt het wel
Maar als ik vervolgens dat vervang door
code:
1
2
$input = "<? echo $blaat; ?>";
$input = str_replace("$", "\\$", $input);


dan is het oude probleem weer terug.

Voorbeeld

[ Voor 29% gewijzigd door Maxonic op 19-12-2002 17:15 . Reden: even [code] gebruikt, anders worden slashes weggelaten ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Zef:
Ik heb hiervoor dit ooit eens gebruikt:
PHP:
17
18
19
$oldlevel=error_reporting(0);
highlight_string($code);
error_reporting($oldlevel);

mja, als je dan echt zo graag de errors wilt onderdrukken, gebruik dan gewoon de '@' ipv die error_reporting aanpassen... Feitelijk 't zelfde, en die @ is er nou eenmaal (:/) dus dan kan je 'm dan ook net zo goed gebruiken......

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 08:38
code:
1
2
$input = "<? echo $blaat; ?>";
$input = str_replace("$", "\\$", $input);
Vind je het heel gek dat ie niets laat zien :?

Op het moment dat jij die tekst aan $input toekent, pleurt php al de contents van $blaat in $input.
Gaat dus alleen goed bij $_POST vars ed.

[ Voor 53% gewijzigd door Limhes op 19-12-2002 17:49 ]


  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
nope, zelfde probleem. Ook hier donderd hij inderdaad de content van $blaat in de string.
Hij doet nu dus in feite alleen een string-replace op het stukje "<? echo ?>"

edit -------

Je was me voor :) Ik ga even proberen de str_replace op de $_POST['var'] los te laten.

[ Voor 27% gewijzigd door Maxonic op 19-12-2002 17:52 ]


  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
Ok, het werkt.

dit heb ik vooraan in het script gezet.
$message = str_replace("$", "(dollarteken)", $_POST['message']);

En dit in de highlight functie:
$input = str_replace("(dollarteken)", "$", $input);

Vervolgens achteraan in het script ook weer een replace van (dollarteken) terug naar $ om de overgebleven $'s te weergeven (degene die niet binnen de php-tags staan)

Perfect! Bedank! *D
Pagina: 1