phpbar.de logo

Mailinglisten-Archive

[php] Lösungsansatz Wortsuche

[php] Lösungsansatz Wortsuche

Niels Jäckel niels.jaeckel at silice.de
Mit Jan 3 19:52:21 CET 2007


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