EisFuX: Mensch und RegEx

Beitrag lesen

(Hallo|Hi(ho)|Tag) MudGuard,

(?:.|\n|\r)
... oder doch eher
[.\r\n]
?
Wäre das nicht einfacher? ... und schneller?

Es ist vor allem etwas vollkommen anderes.
(?:.|\n|\r) matcht ein beliebiges Zeichen, so wie es auch (?:.|[\r\n]) tut.

[.\r\n] dagegen matcht ein Carriage Return oder ein Line-Feed oder einen Punkt.

Mist! Ich wollte mich gerade selbst korrigieren, aber du warst schneller ...

Und weil wir gerade bei schneller sind: Am schnellsten ist wohl /[\x0-\xff]/, noch vor /./s. Zumindest legt das ein kleiner Test nahe, den ich mal kurz gemacht habe. Die Ergebnisse für jeweils 10000 preg_match_all()-Aufrufe:

411 ms -- for /[\x0-\xff]/
993 ms -- for /./s
1603 ms -- for /(.|\n)/
1407 ms -- for /(?:.|\n)/

  
// runtime() holt das Ergebnis von microtime() als float  
// oder die Zeitdifferenz zum übergebenen Wert als float  
// $string enthaelt auch "\r" und "\n"  
$max = 1000;  
  
$elapsed = runtime();  
for ($i = $max; $i; $i--) {  
  preg_match_all('/./s', $string, $matches);  
  ... // das ganze hier 10 mal  
  preg_match_all('/./s', $string, $matches);  
}  
$elapsed = runtime($elapsed);  
debug_writefln('%d ms -- for /./s', $elapsed * 1000);  

MffG
EisFuX