PHP – preg_match() Alternative

preg_match() ist eine grundsätzlich sehr mächtige Funktion, doch gerade das kann auch zu einem Nachteil werden, gerade wenn man schnell und performant überprüfen möchte ob ein String in einem anderen enthalten ist.

Will man nun wirklich nur prüfen ob String A in String B enthalten ist, so ist preg_match() wohl eindeutig “mit Kanonen auf Spatzen schiessen”, doch will man diese Überprüfung nun verfeinern, z.B. um zu überprüfen, ob ein Wort in einem Text vorkommt, aber dabei nicht Teil eines anderen Wortes sein soll, so gibt es in PHP zunächst einmal keine “native” Alternative zu preg_match().

Doch mit nur wenig Aufwand kann man den selben Effekt auch mit einer eigenen Funktion erzielen, welche zudem noch im Schnitt mindestens 10 mal schneller ist als preg_match() (für diese spezielle Anwendung).

Vor genau diesem Problem stand ich nämlich kürzlich selbst, stripos() zu ungenau, preg_match() viel zu langsam, also musste eine eigene Lösung her:

function exactmatch($needle, $haystack) {
// Prüft ob $needle überhaupt in $haystack enthalten ist
$pos = stripos($haystack, $needle);
if ($pos !== FALSE) {
// $needle ist in $haystack enthalten
$pos2 = $pos -1;
if (ctype_alnum(substr($haystack, $pos2, 1))) {
// Das Zeichen direkt vor dem Vorkommen von $needle ist alphanumerisch, das wollen wir nicht, also wird FALSE zurückgegeben
return FALSE;
}
else {
$pos3 = $pos + strlen($needle);
if (ctype_alnum(substr($haystack, $pos3, 1))) {
// Das Zeichen direkt nach dem Vorkommen von $needle ist alphanumerisch, das wollen wir nicht, also wird FALSE zurückgegeben
return FALSE;
}
}
// Die Zeichen direkt vor und nach dem Vorkommen von $needle sind nicht alphanumerisch, es sollte sich also um ein eigenständiges Wort handeln, genau das suchen wir, gib TRUE zurück
return TRUE;
}
}

Diese Funktion hat sich in diversen Tests als genauso exakt wie die zuvor genutzte preg_match() Variante und gleichzeitig fast so schnell (ca 10% langsamer) wie stripos() erwiesen.


Dieser Beitrag wurde unter PHP, Webdesign veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>