Regex, eval en highlight_string

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Arjan90
  • Registratie: September 2005
  • Laatst online: 21-09 20:41
Hallo!

Ik heb wat problemen met het maken van een highlight script voor php. Ik gebruik hiervoor de tags [\php][\/php] (\ toegevoegd i.v.m. tweakers forum).

De code is als volgt:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
$search     =   array('/\[php\](.*?)\[\/php\]/is',                               
                      );

$replace    =   array(highlight_php('<?php $1 ?>'),
                      );

$code = stripslashes($_POST['php']);
$code = preg_replace ($search, $replace, $code);
?>


Dit gaat echter fout, hij voegt namelijk gewoon $1 in (niet als variabele dus), dit terwijl hij natuurlijk de regular expression moet invullen!
Nu las ik iets over eval maar ik vraag me of dit wel kan wat ik wil dat het kan, in dit geval heb ik de volgende code voor replace:
PHP:
1
2
3
4
<?php
$replace    =   array(highlight_php('<?php '. eval("\$1 = \"$1\";") .' ?>'),
                      );
?>

Ik heb dus nog nooit met eval gewerkt en vraag me dan ook sterk af of dit wel klopt, ik heb in feite de tekst in de php manual overgenomen (http://nl.php.net/eval), maar dit werkt dus niet (foutmelding: "Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in /home/mediapnl/public_html/develop/media-tutor/pages/php-code.php(8) : eval()'d code on line 1", heel logisch, maar hoe moet het dan?)

Ook heb ik even gekeken of het uberhaupt wel werkt, als ik alleen '$1' invul (dus zonder highlight_php e.d.) werkt het wel! De highlight_php functie doet niets anders dan highlight_string overigens qua het verwerken van de string die ik meegeef, de code hiervoor is dus niet van belang.

Ik hoop dat iemand mij kan helpen! Eval en Regular Expressions zijn in feite al een redelijk nieuw gebied voor me en ik denk dat ik iets belangrijk mis (met name bij eval).

[ Voor 12% gewijzigd door Arjan90 op 08-02-2008 15:19 ]

"Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid."


Acties:
  • 0 Henk 'm!

Verwijderd

Probeer even \$1 op regel 5.

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

PHP:
1
2
3
4
5
6
7
8
9
10
<?php
$search     =     array('/\[php\](.*?)\[\/php\]/is',                               
                      );

$replace     =     array(highlight_php("<?php".$1."?>"),
                      );

$code = stripslashes($_POST['php']);
$code = preg_replace ($search, $replace, $code);
?>

:?

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Arjan90
  • Registratie: September 2005
  • Laatst online: 21-09 20:41
@TRRoads: Geprobeerd, geen effect. Ik blijf gewoon $1 zien.

@AtleX: Ook al geprobeerd (de meest logische dus ik had het niet vermeld ;) ), toch bedankt! Ik snap er helemaal niets van waarom dat niet gewoon werkt.. 8)7
Foutmelding: "Parse error: syntax error, unexpected T_DNUMBER, expecting T_VARIABLE or '$' in /home/mediapnl/public_html/develop/media-tutor/pages/php-code.php on line 8"

[ Voor 35% gewijzigd door Arjan90 op 08-02-2008 15:23 ]

"Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid."


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 15:55

Patriot

Fulltime #whatpulsert

$1 is in dit geval geen variabele, en een backslash voor de $ kan inderdaad nog wel eens werken. Maar toch zou ik het niet zo doen, ik zou het zo doen:

PHP:
1
2
3
4
5
<?php

$hele_tekst = preg_replace_callback("/\[php\](.*?)\[\/php\]/is", create_function('$matches', 'return highlight_string($matches[1], true);'), $code);

?>


EDIT: De reden dat preg_replace() met die highlight_php() daarin niet werkt komt dus omdat highlight_php() al aan wordt geroepen vóór de replace plaatsvindt.

[ Voor 19% gewijzigd door Patriot op 08-02-2008 16:16 . Reden: PHP codeblokje van gemaakt, create_function() niet afgesloten ]


Acties:
  • 0 Henk 'm!

  • Arjan90
  • Registratie: September 2005
  • Laatst online: 21-09 20:41
@Patriot: Hartstikke bedankt! Het lijkt nu goed te werken! Ik had al van alles geprobeerd, maar omdat het redelijk nieuwe materie in de PHP is voor mij had ik nog wel uren door kunnen zoeken, dit had ik niet zo snel gevonden. Bedankt! Er zat nog wel een klein foutje in, je was vergeten de create_function af te sluiten ;)

De huidige code is nu dus:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$search     =   array('/\[php\](.*?)\[\/php\]/is',                               
                      //test
                      );

$replace    =   array(highlight_php('<?php ' . "\n" . '\$1' . "\n" . ' ?>'),
                      //test
                      ); 

$code = stripslashes($_POST['php']);
$code = preg_replace_callback("/\[php\](.*?)\[\/php\]/is", create_function('$replace', 'return highlight_php($replace[1], true);'), $code);
?>


Ik hoop dat iemand anders hier ook nog wat aan heeft, de eer gaat uit naar Patriot _/-\o_ En nu ga ik weer lekker verder ruziën met PHP >:)

Eén ding snap ik nog niet, wat doe je hier precies:
PHP:
1
2
3
<?php
create_function('$replace', 'return highlight_php($replace[1], true);')
?>

Je creeërt een functie en je gebruikt een $replace[1].. Maar waarom maakt het dan niet uit als ik deze waarde bij $replace verander? Wat is deze $replace[1], want de eerste $replace waarde in een array is toch $replace[0]?

[ Voor 17% gewijzigd door Arjan90 op 08-02-2008 15:48 ]

"Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid."


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 15:55

Patriot

Fulltime #whatpulsert

$replace bevat de matches die gemaakt zijn door de regexp. Het eerste element in de array (dat is inderdaad 0) bevat dan de gehele gematchte string, de [php]-tags staan daar ook nog in. Die wil je natuurlijk niet terugzien in de uiteindelijke code, dus gebruik je het tweede element van de array, die het eerste gematchte backreference bevat (het '(.*?)', wat dus alle PHP code bevat).

@Niet afgesloten create_function(): goed opgemerkt, had de code niet getest dus had hem zo niet kunnen vinden. Bij deze alsnog goed in mijn vorige post :)

[ Voor 17% gewijzigd door Patriot op 08-02-2008 16:16 ]


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Nu online
Ik zou de e modifier met preg_replace gebruiken, dan heb je create_function niet nodig. Voor een overzicht van de modifiers met uitleg zie http://nl2.php.net/manual...cre.pattern.modifiers.php.
Pagina: 1