Webstatt.org - Community seit 2006 - 2012 (2024?)

RegEx mit Funktion kombinieren

Avatar user-168
05.07.2006 10:20

Also, ich stehe vor einem kleinen logischen Problem.
Und zwar teste ich grade mit highlight_string etc. herum, denn ich möchte aus einem Text per RegEx Textstellen heraussuchen und die durch Texte mit Syntaxmarkierungen ersetzen.

Im Klartext:

Ein langer Text enthält einige Codezeilen die jeweils mit [.php] und [./php] umklammert sind. Nun möchte ich per RegEx die Stellen raussuchen, den Inhalt highlighten udn dann wieder in den Text einfügen.


$text = preg_replace('#\[php\]((?U).*)\[\/php\]#s',
highlight_string('\\1'zwinkern,
$text);


Das funktiniert schonmal nicht und mit:

preg_match_all('#\[php\]((?Ums).*)\[\/php\]#s', $text, $elemente, PREG_PATTERN_ORDER);
for ($i=0; $i<=count($elemente); $i++)
echo $i.'. '.highlight_string($elemente[1][$i]).'<br><br><br><br><br>';


Gibt er mir nur zwei oder drei der PHP-Codes aus und nichtmal die ersten, sondern das erste und zwei irgendwo aus der Mitte des Textes.
Zumal die Highlight-Befehle und show_source ja scheinbar sogar direkt ausgeben und nicht zurückgeben.

Aber es muss doch irgendwie machbar sein, das Forum hier kann das zB ja auch. Kann mir da einer helfen?

Dustwolf ------------------------- Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein. F. Nietzsche
Avatar user-300
05.07.2006 11:42

Du brauchst den e Modifier und den zweiten (in der deutschen Doku nicht erwähnten) Parameter von highlight_string zwinkern

$text = preg_replace('#\[php\]((?U).*)\[\/php\]#se',
"highlight_string('\\1', 1)",
$text);

(beachte, dass der Befehl in Anführungs- und Schlusszeichen gesetzt wurde)

edit: Hast du schon eine elegante Lösung für die restliche Formatierung - sprich: <p></p> um Text etc. - gefunden? Daran scheitere ich gerade kläglich. traurig

Avatar user-168
05.07.2006 12:07

Danke ersmtal. Ich habe gerade gesehen, dass der zweite Parameter ganz weit unten in den Anmerkungen von einem der User dort benutzt wird. :tired:


Die anderen Formatierungen spielen für mich keine Rolle, da ich die Texte über ein von mir geschriebenes Templatesystem ausgebe und die automatisch formatiert sind.
Ich brauchte halt nur für die Code-Stücke ne automatische Lösung für die Syntaxmarkierung, die nicht sofort ein Resultat ausgibt, sondern einfach die Ausgabe in eine Variable packt, damit ich diese an das Templatesystem übergeben kann. Fettes Grinsen

Eine Frage zum Detail noch:
Anführungs- und Schlusszeichen


Wirklich Gänsefüsschen, oder nur die RegEx-typischen Begrenzer, also in meine Fall beispielsweise das Zeichen Raute (#)?

Dustwolf ------------------------- Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein. F. Nietzsche
Avatar user-300
05.07.2006 12:44

Original von user-168
Eine Frage zum Detail noch:
Anführungs- und Schlusszeichen


Wirklich Gänsefüsschen, oder nur die RegEx-typischen Begrenzer, also in meine Fall beispielsweise das Zeichen Raute (#)?


Entweder hast du mich falsch verstanden oder ich habe keine Ahnung was du meinst zwinkern
Der zweite Parameter von preg_replace muss in Anführungs- und Schlusszeichen oder Hochkommas und darf nicht einfach als Befehl dort stehen. Ein Beispiel dazu auch in der (englischsprachigen) Doku zu preg_replace().

Avatar user-168
05.07.2006 12:53

Ja, OK, wir haben aneinander vorbei geredet. Hat sich aber erledigt, da du trotzdem auf meine Frage antworten konntest. Fettes Grinsen

Dustwolf ------------------------- Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein. F. Nietzsche
Avatar user-271
05.07.2006 13:58

nur der vollständigkeit halber ;D
es gibt noch die funktion: preg_replace_callback wo er eine funktion aufruft, in deinem fall sähe das dann so aus:

function ersetze($treffer) {
return highlight_string($treffer[1],1);
}
preg_replace_callback('#\[php\]((?U).*)\[\/php\]#s',"ersetze",$text);


ist natürlich umständlicher zwinkern aber gut...für größere sachen, ist das die ideale funktion *fg*

#!/bin/bash
traurig){ neutral:& };: