Funktion substr_count() - Häufigkeit von enthaltenen Strings ermitteln

Im Verlauf einer PHP-Anwendung müssen Strings häufig darauf überprüft werden, wie oft ein Teil-String darin enthalten ist. Beispielsweise enthalten E-Mailadressen nur einmal das Zeichen @ und man könnte den String darauf überprüfen, wie oft das Zeichen vorkommt und bei einem Ergebnis größer als 1 die Verarbeitung stoppen. Für solche Überprüfungsaufgaben kann in PHP die Funktion substr_count() verwendet werden. Mit der Funktion wird überprüft, wie oft ein Teil-String in einer Zeichenkette enthalten ist. Die Parameterangabe ist wie folgt.

  • Die Zeichenkette, die nach einem Teil-String durchsucht werden soll (haystack).
  • Der Teil-String, nach dem in der Zeichenkette gesucht werden soll (needle).
  • Versatz, falls die Zählung nicht von Beginn an durchgeführt werden soll (offset, optional).
  • Die maximale Länge an Zeichen, die bei der Suche nach dem Teil-String berücksichtigt werden sollen (length, optional).

Im folgenden Beispielcode wird gezählt, wie oft das Zeichen a in der Zeichenkette enthalten ist.

<?php

$str = 'abcabc';
$needle = 'a';

// Ausgabe 2
echo substr_count($str, $needle);

?>

Wenn man als zweiten Parameter (needle) mehrere Zeichen angibt, so wird nicht das Vorkommen der einzelnen Zeichen gezählt, sondern der gesamte Teil-String. Beim folgenden Beispiel soll der Teil-String ac gezählt werden. Die beiden Zeichen a und c kommen im String jedoch nicht zusammenhängend vor. Daher ist der Rückgabewert 0.

<?php

$str = 'abcabc';
$needle = 'ac';

// Ausgabe 0
echo substr_count($str, $needle);

?>

Die Funktion substr_count() ist case-sensitive. Im folgenden Code ist der Rückgabewert daher ebenfalls 0.

<?php

$str = 'abcabc';
$needle = 'A';

// Ausgabe 0
echo substr_count($str, $needle);

?>

Die Zählung erfolgt standardmäßig mit dem ersten Zeichen (Position 0). Mit dem dritten Parameter (offset) kann ein Versatz angegeben werden, sodass die ersten Zeichen übersprungen und nicht gezählt werden. Beim folgenden Beispiel ist der Rückgabewert 1, da die Zählung ab dem zweiten Zeichen (Position 1) beginnt.

<?php

$str = 'abcabc';
$needle = 'a';
$offset = 1;

// Ausgabe 1
echo substr_count($str, $needle, $offset);

?>

Mit dem vierten Parameter (length) wird festgelegt, wie viele Zeichen (ab offset) für die Zählung berücksichtigt werden sollen. Beim folgenden Beispiel ist dritte Parameter auf 1 und der vierte Parameter auf 2 gesetzt. Die Zählung beginnt mit dem zweiten Zeichen des Strings und endet mit dem dritten Zeichen, sodass das Zeichen a nicht gefunden wird. Der Rückgabewert ist daher 0.

<?php

$str = 'abcabc';
$needle = 'a';
$offset = 1;
$length = 2;

// Ausgabe 0
echo substr_count($str, $needle, $offset, $length);

?>

Bei der Angabe des vierten Parameters (length) gilt die Besonderheit, dass falls die angegebene Zahl größer ist als die Anzahl der restlichen Zeichen ab offset, die Funktion den Rückgabewert FALSE liefert. Das kann festgestellt werden, indem man den Rückgabewert in einer Variable speichert und eine if-, else-Abfrage anwendet.

<?php

$str = 'abcabc';
$needle = 'a';
$offset = 1;
$length = 6;

// Rückgabewert FALSE
$a = substr_count($str, $needle, $offset, $length);

if ($a === FALSE)
{
  echo 'Rückgabewert ist FALSE';
}
else
{
  echo 'Rückgabewert ist TRUE';
}

?>

Die Funktion substr_count() arbeitet genau genommen mit den Bytestellen, die die Zeichen belegen. Das kann bei Multibyte-Zeichen wie z.B. den Umlauten oder anderen Zeichen in der Zeichenkodierung UTF-8 dazu führen, dass der Rückgabewert nicht richtig ist. Beim folgenden Beispiel ist als offset die Zahl 2 angegeben, sodass die Zählung mit dem dritten Zeichen beginnen und der Rückgabewert eine 1 sein sollte. Der Rückgabewert ist jedoch 2, da die Zählung mit der dritten Bytestelle beginnt und das erste ä die ersten beiden Bytestellen belegt. Dementsprechend werden die nächsten beiden Zeichen ä gezählt.

<?php

$str = 'äää';
$needle = 'ä';
$offset = 2;

// Ausgabe 2
echo substr_count($str, $needle, $offset);

?>

In solchen Fällen sollte auf die Multibyte-Funktion mb_substr_count() zurückgegriffen werden. Die Funktionalität ist ähnlich wie bei substr_count(), man kann jedoch auch die Zeichenkodierung angeben und die Belegung mehrerer Bytes von Zeichen wird berücksichtigt. Hierfür muss auf dem Server die PHP-Erweiterung mbstring aktiviert sein.