Mailinglisten-Archive |
Hallo Jens,
> Ok , dann brauchst du RegEx. Versuch es mal so in der Art:
>
> --------------------------------Begin Code-----------------------------
> $del_start = '<&>';
> $del_end = '<%>';
>
> $word = 'Supermann';
>
> $pattern = '/' # - Pattern-Delimiter
> . $del_start # - dein Start-Delimiter
> . '([^' . $del_end . ']*' # - Alles ausser deinem End-Delimiter
> . $word # - Das Wort nach dem du suchst
> . '.*)' # - Irgendwas....
> . $del_end # - Dein End-Delimiter
> . '/sU'; # - Pattern-Delimiter
> # und Flags.
>
> if ($count = preg_match_all($pattern, $text, $matches)) {
>
> print_r($word . ' kommt ' . $count . ' mal in den Delimitern vor');
> print_r($matches);
>
> }
> ---------------------------------End Code------------------------------
das wird so sicher nicht funktionieren:
1. '([^' . $del_end . ']*' funktioniert nur, wenn der Delimiter aus
genau einem Zeichen besteht. Wenn du allerdings o.g. Delimiter da in die
Zeichenklasse setzt, heißt das, dass keins der Zeichen des Delimiters
vorkommen darf. Die RegEx würde also schon bei z.b. < zuschlagen.
2. Die eingesetzen Teile müstten alle mit preg_quote() vorbereitet
werden um Steuerzeichen zu escapen.
3. Selbst wenn das Pattern von 1. so funktionieren würde, hättest du
nichts in der Hand, wenn Delimiters verschachtelt werden. Aus Alex'
letztem Beispiel entnehme ich, dass dies durchaus der Fall sein kann.
Allerdings ist ein Algorithmus, der das tut, was ich glaube verstanden
zu haben, nicht trivial. Ein wichtiges Kriterium ist z.B. ob man sich
immer auf Wohlgeformtheit verlassen kann, d.h. nach jedem <&> kommt auch
ein <%>.
Vielleicht kann man an der Sache an sich etwas vereinfachen.
@Alex: Müssen die Delimiter unbedingt aus mehr als 1 Zeichen bestehen?
Müssen die Delimiter verschachtelbar sein? Darf zwischen den Delimitern
jedes beliebige Zeichen vorkommen. Wenn du z.B. Variablenersetzungen
machen möchtest, könnte man sich z.B. auf einen Stil wie diesen festlegen:
$[a-z]+$
D.h. Die Begrenzung ist jeweils ein Dollarzeichen, dazwischen (der
Variablenname) darf nur aus Buchstaben bestehen, und muss min. 1 Zeichen
lang sein. Falls eine solche Einschränkung des Syntax möglich ist, wäre
dein Problem leichter zu lösen ;-)
Wenn diese Einschränkungen nicht möglich sind, musst du dir wohl oder
übel einen kleinen Parser bauen, der den Text Zeichen für Zeichen
untersucht und einen internen Delimiter-Count mitführt. Speziell
rekursive Verschachtelungen sind mit RegEx NICHT formulierbar!
Grüße,
Niels
php::bar PHP Wiki - Listenarchive