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