Manchmal stellt sich bei der Ausführung eines Skriptes die Frage, wie lang ein String ist, welche Größe er im Speicher hat.
In PHP stehen uns hier für die verschiedenen Anwendungsfälle einige Möglichkeiten zur Verfügung.
Im Folgenden versuche ich die Wichtigsten davon in Beispielen möglichst ansprechend und beschreibend darzustellen.
1. Länge eines Strings in Bytes mit strlen ermitteln
Mit der Funktion strlen kannst du dir die Größe eines Strings in Bytes ausgeben lassen.
strlen($string) $string Der string wird auf seine Länge hin untersucht
Für viele Strings mag dieser Wert gleich der Zeichenlänge sein, allerdings ist dies bei manchen Sprachen nicht der Fall.
$hello_world = 'Hello World'; echo strlen($hello_world); // 11 // Hello World auf Japanisch $utf8 = "こんにちは世界"; echo strlen($utf8); // 21
Im vorherigen Beispiel ist ein String auf Japanisch mit 7 Zeichen abgebildet.
Das Ergebnis von strlen ergibt allerdings das dreifache.
Mit utf8_decode kannst du einen String von UTF-8 nach ISO-8859-1 konvertieren.
Dabei werden die nicht in ISO-8859-1 existieren oder nicht gültig in UTF-8 sind durch ‚?‘ ersetzt.
Um die Anzahl an Zeichen in einem String zu zählen, ist diese Konvertierung meist ausreichend.
$utf8 = "こんにちは世界"; echo strlen(utf8_decode($utf8)); // 7
2. Multibyte Strings mit mb_strlen und iconv_strlen
2.1. mb_strlen
Da ein Byte nur aus 8 bits besteht, kann dieser maximal 256 (2^8) einzigartige Werte haben.
Dies kommt uns in die Quere, wenn wir Strings in Sprachen überprüfen, deren Zeichen nicht mit einem Byte gespeichert repräsentiert werden können.
Um diese Art String zu behandeln, stellt uns PHP die Funktion mb_strlen zur Verfügung.
mb_strlen($string, $zeichenkodierung) $string (erforderlich) Der String, dessen Länge zurückgegeben wird $zeichenkodierung (optional) Angewendete Zeichenenkodierung Standardwert ist die interne Zeichenkodierung
Diese Funktion gibt die Anzahl der Zeichen im String mit der angegebenen Zeichenkodierung zurück. Ein Multibyte Zeichen wird hierbei als 1 gezählt.
echo mb_strlen("こんにちは世界"); // 7
Du kannst in der Funktion mb_strlen die Zeichenkodierung als zweiten Parameter übergeben.
Wenn du hier eine gültige, für deinen String jedoch unpassende Zeichenkodierung angibst, können die Ergebnisse durchaus variieren.
echo mb_strlen("こんにちは世界", 'utf-8'); // 7 echo mb_strlen("こんにちは世界", 'Big5'); // 11 echo mb_strlen("こんにちは世界", 'utf-32'); // 5
Wenn du als Zeichenkodierung einen ungültigen Wert übergibst, erhältst du eine Fehlermeldung und als Rückgabewert false.
var_dump(mb_strlen("こんにちは世界", 'utf-4')); // Warning: mb_strlen(): Unknown encoding "utf-4" in C:\...\string_length.php on line 53 // bool(false)
Mit der Funktion mb_internal_encoding kannst du erfragen welche die interne Zeichenkodierung ist und diese ändern.
echo mb_internal_encoding("UTF-8"); // 1 echo mb_internal_encoding(); // UTF-8
Auch hier erhältst du eine Fehlermeldung und false als Rückgabewert, wenn du diese mit einer ungültigen Kodierung aufrufst.
var_dump(mb_internal_encoding('utf-4')); // Warning: mb_internal_encoding(): Unknown encoding "utf-4" in C:\...\string_length.php on line 59 // bool(false)
2.2 iconv_strlen
Die Funktion iconv_strlen hat den gleichen Zweck wie mb_strlen: Du kannst mit ihr Multibyte Zeichen zählen.
echo iconv_strlen("こんにちは世界"); // 1 echo iconv_strlen("こんにちは世界", "UTF-8"); // 1
Der wesentliche Unterschied zwischen mb_strlen und iconv_strlen ist der Umgang mit schlechten Zeichenfolgen.
Während mb_strlen diese ignoriert, gibt iconv_strlen einen Fehler zurück.
$string = "\xe9"; echo mb_strlen($string,'utf-8'); // 1 echo iconv_strlen($string,'utf-8'); // iconv_strlen(): Detected an incomplete multibyte character in input string in C:\...\string_length.php on line 74
3. Vorkommen eines Teilstrings zählen mit substr_count
Mit der Funktion substr_count kannst du in Erfahrung bringen, wie oft sich ein Teilstring in einem String befindet.
substr_count($heuhaufen, $nadel, $versatz, $laenge) $heuhaufen (erforderlich) String, in dem gesucht wird $nadel (erforderlich) Der gesuchte Teilstring $versatz (optional) Der Punkt ab dem im String gesucht wird Bei negativem Wert wird vom Ende des Strings gezählt $laenge (optional) Maximale Länge nach $versatz Negative Länge zählt vom Ende des $heuhaufen
Wenn $versatz und $laenge zusammen größer als die Stringlänge sind, wird eine Warnung ausgegeben.
Wenn du substr_count mit zwei Parametern aufrufst, erhältst du als Rückgabewert die Anzahl der Vorkommen des Teilstrings $nadel.
$string = 'Code Citrus Citrus Code Citrus'; echo substr_count($string, 'Citrus'); // 3
Mit Angabe des Versatz kannst du bestimmen, von welcher Indexposition an der String nach dem Teilstring durchsucht werden soll.
echo substr_count($string, 'Citrus', 11); // 2
Im vorigen Beispiel wurde der hier dick unterlegte Teil des Strings untersucht:
‘Code Citrus Citrus Code Citrus‘
Mit dem vierten Parameter kannst du bestimmen, wie viele Zeichen nach dem angegebenen Versatz auf den Teilstring untersucht werden sollen.
In diesen beiden Beispielen wurden folgende Teilstrings untersucht:
‘Code Citrus Citrus Code Citrus’
‘Code Citrus Citrus Code Citrus’
Du kannst sowohl für den dritten als auch den vierten Parameter negative Zahlen übergeben. Bei negativem Versatz wird ein Wert relativ zum Ende des Strings statt vom Anfang angenommen.
$string = 'phpphpphp'; echo substr_count($string, 'php', -6); // 2
Das entspricht diesem Teilstring: ‘phpphpphp‘
Dasselbe gilt für die Länge.
echo substr_count($string, 'php', -6, -3); // 1
Hier wurde nur dieser Teil untersucht: ‘phpphpphp’
4. Vorkommen einzelner Zeichen mit PHP count_chars ermitteln
Die Funktion count_chars zählt das Vorkommen einzelner Zeichen in einem String. Die Ergebnisse variieren je nach verwendetem Modus.
count_chars($string, $modus) $string (erforderlich) Der String dessen Zeichen gezählt werden $modus (optional) Wert der Angibt, wie das Ergebnis zurückgegeben wird Standardwert ist 0
Wenn du an count_chars nur einen String übergibst, erhältst du als Rückgabewert ein Array mit allen Byte-Werten und der Anzahl an Vorkommnisse des zugehörigen Buchstaben.
$string = 'CodeCitrus'; print_r(count_chars($string));
Output (gekürzt):
Array( [0] => 0 [1] => 0 … [100] => 1 [101] => 1 … [254] => 0 [255] => 0 )
Wenn du beim Aufruf der Funktion $modus auf 1 setzt, erhältst du ein ähnliches Array, allerdings nur mit Werten, die auch im String vorhanden sind.
print_r(count_chars($string, 1));
Output (gekürzt):
Array( [67] => 2 [100] => 1 [101] => 1 [105] => 1 … )
count_chars($string, 2) gibt ein Array mit allen Bytewerten der verwendeten Zeichen zurück, die nicht in dem String vorhanden sind.
Mit 3 für $modus erhalten wir einen String mit allen verwendeten Buchstaben.
echo count_chars($string, 3); // Cdeiorstu
Mit $modus = 4 gibt count_chars einen String mit allen nicht verwendeten Zeichen aus.
Hier eine kurze Übersicht über die 5 möglichen Modi:
0 – Array mit Byte-Werten als Schlüssel und Häufigkeit als Wert
1 – wie 0, allerdings nur Werte, die mindestens einmal vorkommen
2 – wie 0, allerdings nur Werte, die nicht vorkommen
3 – String mit allen vorkommenden Zeichen
4 – String mit allen nicht vorkommenden Zeichen
5. Anzahl der Wörter eines Strings mit str_word_count ermitteln
Mit str_word_count kannst du die Anzahl an Wörtern in einem String zählen.
str_word_count($string, $format, $zeichenliste) $string Der String der gezählt wird $format (optional) Das Format, in dem die Rückgabe erfolgt $zeichenliste (optional) Zeichen, die als Bestandteile von Worten betrachtet werden
Der einfache Aufruf, mit nur einem String als Parameter, gibt die Anzahl gefundenen Wörter als Integer zurück.
echo str_word_count('foo bar baz'); // 3
Wenn du als zweiten Parameter 1 oder 2 angibst, erhältst du als Rückgabewert ein Array mit allen gefundenen Worten.
Bei 2 wird zusätzlich als Schlüssel für die Worte die Position im String angegeben.
0 – Anzahl gefundener Wörter als Integer
1 – Array mit allen gefundenen Wörtern
2 – Array, dessen Schlüssel die Position des Wortes angibt
Hier ein Beispiel für 1 und 2:
print_r(str_word_count($string, 1)); // Array ( [0] => foo [1] => bar [2] => baz ) print_r(str_word_count($string, 2)); // Array ( [0] => foo [4] => bar [8] => baz )
Mit dem dritten Parameter, $zeichenliste, kannst du Zeichen angeben, die als Bestandteile von Worten betrachtet werden.
Normalerweise würde die Angabe von Zahlen ein Word trennen.
$string = 'foo5bar baz'; echo str_word_count($string); // 3 print_r(str_word_count($string, 1)); // Array ( [0] => foo [1] => bar [2] => baz ) print_r(str_word_count($string, 2)); // Array ( [0] => foo [4] => bar [8] => baz )
Wenn du 5 als Teil eines Wortes in $zeichenliste festlegst, wird dieses dadurch nicht mehr geteilt.
echo str_word_count($string, 0, '5'); // 2 print_r(str_word_count($string, 1, '5')); // Array ( [0] => foo5bar [1] => baz ) print_r(str_word_count($string, 2, '5')); // Array ( [0] => foo5bar [8] => baz )
6. Fazit
Um die Länge eines Strings in Bytes zu ermitteln, gibt es strlen.
Mit mb_strlen und iconv_strlen kann die Anzahl Zeichen in einem Multibyte String ermittelt werden.
Wie oft ein Teilstring in einem String auftaucht, kannst du mit substr_count erfragen. Informationen über die verwendeten Zeichen kannst du mit count_chars abfragen.
Die Anzahl von Wörtern in einem String kannst du mit str_word_count ermitteln.
Wenn du Fragen oder Anmerkungen hast, schreib es in die Kommentare!
Schreibe einen Kommentar