Edgar Ehritt: erkennen ob PCRE "\p{L}" verfügbar ist

Beitrag lesen

Hallo erstmal!

Ich hab' aktuell folgende beiden Ausdrücke um Zeichenketten in Wörter aufzutrennen - ja, nicht perfekt, aber ist nur zum Testen - Problem liegt anderswo :)

preg_match_all('/\p{L}+/u', $str, $arr);

preg_match_all('/\w+/u', $str, $arr);


>   
>   
> Führe ich auf einem System ohne \p-Unterstützung ersteren Ausdruck aus, erhalte ich folgende Fehlermeldung:  
>   
> Warning: preg\_match\_all() [function.preg-match-all]: Compilation failed: support for \P, \p, and \X has not been compiled [...]  
>   
> Das ist natürlich nicht cool :)  
  
Doch, das ist sogar sehr "cool". Wie zu sehen ist, wird das Script nicht mit einem Fatal Error abgebrochen. Denn; was macht man, wenn man sich nicht sicher ist, ob etwas so funktioniert, wie man es selbst plante? Man guckt nach, ob die gewünschte Wirkung einsetzte. Das aber ginge nicht, wenn das Script abbrach.  
 Zwei Optionen hast Du jedenfalls. Zum einen kannst Du mit einem Test eine Zeichenkette mit beiden Varianten durchlaufen lassen und `$arr`{:.language-php} vergleichen und im weiteren Steuerfluss darauf bedingt (if-else) Rücksicht nehmen. Zum anderen kannst Du die Fehlerbehandlung von PHP nutzen, um Dein Problem zu meistern:  
  
~~~php
function p_fehler($a,$b,$c,$d,$e){  
	/* print_r(array($a,$b,$c,$d,$e));  
  
	   zum angucken, was da alles feines übergeben wird, um später  
	   richtig zu prüfen. Im Folgenden nehme ich einfach  
	   E_COMPILE_WARNING, weil es das vermutlich trifft. Generell  
	   ist nur auf den Fehlercode, hier $a, verlass. Fehlermeldungs-  
	   texte sind nicht zur Überprüfung geeignet!  
	*/  
	if($a==E_COMPILE_WARNING){  
		preg_match_all('/\w+/u', $GLOBALS['str'], $GLOBALS['arr']);  
	}  
	/* return(false);  
  
	   falls die Fehlerausgabe benötigt wird, muss dieser call back  
	   FALSE zurückgeben!  
	*/  
}  
set_error_handler('p_fehler');  
preg_match_all('/\p{L}+/u', $str, $arr);  
restore_error_handler();

Gruß aus Berlin!
eddi