Funktion str_pad() - Zeichenkette erweitern mit Füllzeichen

Es kann vorkommen, dass man eine Zeichenkette mit einem Füllzeichen erweitern muss. Das kann z.B. bei unterschiedlichen Postleitzahl-Längen notwendig sein, damit diese bei geringen Anzahl an Ziffern mit führenden Nullen versehen werden. Hierfür kann man in PHP die Funktion str_pad() verwenden. Innerhalb der runden Klammern werden die folgenden Parameter angegeben.

  1. Die zu bearbeitende Zeichenkette (string).
  2. Die Anzahl der Zeichen, auf die die Zeichenkette erweitert werden soll (pad_length).
  3. Das Füllzeichen, mit dem die Erweiterung durchgeführt wird (pad_string, optional, Standard Leerzeichen).
  4. Angabe der Seite, welches gefüllt wird (pad_type, optional, Standard rechts).

Falls die Länge der Zeichenkette größer ist als die angegebene Mindestlänge pad_length, erfolgt keine Veränderung. Beim folgenden Beispiel wird die Variable $str1 mit 4 weiteren Leerzeichen erweitert. Da das Füllzeichen (pad_string) nicht angegeben wurde, gilt als Standard das Leerzeichen. Der Effekt ist im Quelltext der PHP-Seite sichtbar.

<?php

$str1 = 'A';
$str2 = 'B';

$str1 = str_pad($str1, 5);

// Ausgabe A    B
echo $str1 . $str2;

?>

Füllzeichen (pad_string) angeben

Falls man als Füllzeichen keine Leerzeichen möchte, kann man diesen als dritten Parameter angeben. Beim folgenden Beispiel wird die Variable $str1 mit Bindestrichen gefüllt.

<?php

$str1 = 'A';
$str2 = 'B';

$str1 = str_pad($str1, 5, '-');

// Ausgabe A----B
echo $str1 . $str2;

?>

Zu füllende Seite (pad_type) angeben

Standardmäßig wird die rechte Seite der Zeichenkette mit dem Füllzeichen erweitert. Mit dem vierten Parameter ist es auch möglich, die zu füllende Seite vorzugeben. Der Standardwert entspricht dem Wert STR_PAD_RIGHT. Um die linke Seite des strings füllen zu lassen, gibt man STR_PAD_LEFT an.

<?php

$str1 = 'A';
$str2 = 'B';

$str1 = str_pad($str1, 5, '-', STR_PAD_LEFT);

// Ausgabe ----AB
echo $str1 . $str2;

?>

Um beide Seiten füllen zu lassen, gibt man als vierten Parameter STR_PAD_BOTH an. Falls die Füllzeichen nicht genau auf beide Seiten aufgeteilt werden können, wird die rechte Seite mit einem Zeichen mehr gefüllt.

<?php

$str1 = 'A';
$str2 = 'B';

$str1 = str_pad($str1, 6, '-', STR_PAD_BOTH);

// Ausgabe --A---B
echo $str1 . $str2;

?>

Fehlstellen mit der Zeichenkodierung UTF-8

Für die Berechnung der Länge der Zeichenkette wird bei genauer Betrachtung nicht die tatsächliche Anzahl der Zeichen herangezogen, sondern die Anzahl der Bytes, die diese belegen. Dabei wird davon ausgegangen, dass ein Zeichen 1 Byte belegt. Das kann insbesondere bei der Verwendung der Zeichenkodierung UTF-8 zu Problemen führen, da hierbei viele Zeichen 2 oder sogar mehr Bytes belegen.

In UTF-8 belegen Umlaute 2 Bytes. Würde man z.B. die Zeichenkette Ü mit dem Füllzeichen Ä erweitern lassen, würde man als Ergebnis ÜÄ� erhalten. Das Zeichen Ü belegt 2 Bytes, das Zeichen Ä ebenfalls. Das kryptische "Diamond-Zeichen" entsteht, weil vom Zeichen Ä nur das erste Byte verwendet wird.

<?php

$str1 = 'Ü';
$str2 = 'B';

$str1 = str_pad($str1, 5, 'Ä');

// Ausgabe ÜÄ�B
echo $str1 . $str2;

?>

Eigene Multibyte-Funktion für UTF-8 verwenden

Da es in PHP laut dem Stand von 03/2016 keine fertige Multibyte-Funktion von str_pad existiert, kann man eine eigene Funktion schreiben, mit der auch die Zeichenkodierung bei der Anwendung von str_pad berücksichtigt wird. Mit der folgenden Funktion mb_str_pad würde die Anzahl der Zeichen in der Zeichenkette berücksichtigt werden.

<?php

function mb_str_pad 
(
$input, 
$pad_length, 
$pad_string = ' ', 
$pad_style = STR_PAD_RIGHT, 
$encoding='UTF-8'
) 

{

  $pad_length = $pad_length - mb_strlen($input,$encoding) + strlen($input);

  return str_pad
  (
  $input, 
  $pad_length, 
  $pad_string, 
  $pad_style
  );
}

$str1 = 'Ü';
$str2 = 'B';

$str1 = mb_str_pad($str1, 5, '-');

// Ausgabe Ü----B
echo $str1 . $str2;

?>

Bei dieser Funktion darf das Füllzeichen nur 1 Byte belegen. Das dürfte für die meisten Anwendungsfälle jedoch ausreichend sein. Falls man Füllzeichen verwenden möchte, die mehr als ein Byte belegen, muss man die Funktion erweitern.

<?php

function mb_str_pad 
(
$input, 
$pad_length, 
$pad_string = ' ', 
$pad_style = STR_PAD_RIGHT, 
$encoding='UTF-8'
) 

{

  $m = strlen($pad_string);
  $pad_length = ($pad_length - mb_strlen($input,$encoding)) * $m + strlen($input);

  return str_pad
  (
  $input, 
  $pad_length,
  $pad_string, 
  $pad_style
  );
}

$str1 = 'Ü';
$str2 = 'B';

$str1 = mb_str_pad($str1, 5, 'Ä');

// Ausgabe ÜÄÄÄÄB
echo $str1 . $str2;

?>

Es gibt noch weitere Varianten, um Mehrbyte-Zeichen mit der Funktion str_pad() zu berücksichtigen.