search
subnavi
Werbung

Stringfunktionen

Frage: Was ist besser, print() oder echo?

Antwort von Kristian Köhntopp:

echo() ist ein internes Sprachkonstrukt und gibt nichts zurück, print() ist eine Expression. Man kann print() also in Situationen benutzen, wo Expressions gefragt sind, z. B. $var ? print("...") : null; .

echo hat eine variable Argumentliste, dabei muss man aber auf die Klammern verzichten: echo $var1, $var2; . print() kann nur ein Argument haben und gibt immer 1 zurück.

Frage: Wie zerlege ich einen String?

Antwort von Kristian Köhntopp:

Man kann die einzelnen Zeichen in einem String ähnlich wie ein Array ansprechen, allerdings verwendet man anstelle der eckigen Klammern [ und ] geschweifte Klammern: { und } .

$str = "teststring";
$len = strlen($str);
for($i=0; $i<$len; $i++)
  printf("Zeichen %d ist %s<br>\n", $i, $str{$i}); 

Diese Methode ist auch geeignet, um einen String in ein Array umzuwandeln:

function stringToArray($string) {
  $array = array();
  for($i=0; $i<strlen($string); $i++)
    $array[$i] = $string{$i};
  return $array;
} 

Mit Hilfe der Funktion substr() kann man Teilstrings aus einem String herausschneiden.

Mit Hilfe der Funktion explode() kann man einen String an einem Trennzeichen in ein Array zerlegen.

$str = "dies ist ein teststring.";
  $avar = explode(" ", $str);
  $len = count($avar);
  for ($i=0; $i<$len; $i++)
    printf("%d: %s<br>\n", $i, $avar[$i]); 

Dieses Beispiel zerlegt den gegebenen Teststring an den Leerzeichen und erzeugt ein Array $avar mit den Indices 0 bis 3 (4 Elementen).

Kompliziertere Zerlegungen lassen sich mit Hilfe der Funktion preg_split() vornehmen. Das veraltete, weniger leistungsfähigere und langsamere split() könnte man auch verwenden.

$str = "ich bin  ein    sehr komplizierter test, nicht wahr?";
  $avar = preg_split("/[ \t.!?]+/", $str);
  $len = count($avar);
  for ($i=0; $i<$len; $i++)
    printf("%d: %s<br>\n", $i, $avar[$i]); 

Im Gegensatz zum vorhergehenden Beispiel werden hier mehrfache Leerzeichen nicht als mehrfache Trennungen gezählt und auch Satzzeichen werden zu den Trennzeichen gezählt.

Frage: Wie zerlege ich eine URL?

Antwort von Kristian Köhntopp:

Mit Hilfe der Funktion parse_url() kann eine URL in ihre Bestandteile zerlegt werden.

$str = "http://user:password@www.koehntopp.de:80/kris/artikel#php";
  $avar = parse_url($str);
  reset($avar);
  while(list($k, $v) = each($avar))
    printf("k=%s, v=%s<br>\n", $k, $v); 

Ein QUERY_STRING kann mit Hilfe der Funktion parse_str() in seine Variablen zerlegt werden.

Frage: Wie gebe ich eine Zahl formatiert aus?

Antwort von Kristian Köhntopp:

Mit Hilfe der Funktion number_format() oder mit Hilfe von printf() .

Frage: Wie kann ich Zeilenumbrüche verarbeiten?

Antwort von Johannes Frömter:

Die sogenannten "Zeilenumbrüche" sind im Prinzip ganz gewöhnliche Bytes wie ein A oder % auch - sie werden erst bei der Anzeige in einem Editor als Zeilenumbrüche dargestellt. Hässlicherweise haben sich für diesen Zweck unterschiedliche Zeichen (Bytes) etabliert: Windows verwendet \r\n , Unix \n und der Mac \r als "neue-Zeile-Zeichen". Dabei gilt:

Escape-  Hex-  ASCII-  Abkür-  Name/Bedeutung      Name/Bedeutung
Sequenz  Code  Code    zung    englisch            deutsch
-------  ----  ------  ------  ------------------  --------------
\r       0D    13      CR      carriage return     Wagenrücklauf
\n       0A    10      LF      line feed, newline  Zeilenvorschub
-------  ----  ------  ------  ------------------  -------------- 

Die Unterscheidung zwischen Wagenrücklauf und Zeilenvorschub rührt von den Zeilendruckern her, bei denen das zwei separate Steuersignale sind.

Die Escape-Sequenzen können in PHP direkt in Strings, die zwischen " (Anführungszeichen, double quotes) stehen, sowie in Regulären Ausdrücken verwendet werden. Ebenso kann man dort \x0D , \x0A etc. (hexadezimale Escape-Sequenzen) verwenden. Die ASCII-Codes kann man von der Funktion chr() umwandeln lassen.

Empfängt man Daten von unbekannten Clients, sollten verarbeitende Funktionen mit allen Varianten zurecht kommen; eine universelle Funktion zum Ersetzen von Zeilenumbrüchen durch Leerzeichen sieht z. B. so aus:

$string = preg_replace('/\r\n|\r|\n/', ' ', $string); 

Frage: Wie kann ich Zeilenumbrüche in <br> umwandeln?

Antwort von Kristian Köhntopp:

PHP bietet die Funktion nl2br() , die vor jedem Zeilenumbruch ein <br> einfügt. Ab PHP 4.0.5 wird statt <br> das XHTML-konforme <br /> verwendet. Diese Schreibweise ist auch mit älteren Browsern kompatibel und wird auf jeden Fall empfohlen. Anzumerken ist hierbei, dass die von Mac als "Neue-Zeile-Zeichen" verwendeten Carriage-Returns ( \r ) nicht als solches erkannt werden und deshalb nicht in <br /> umgewandelt werden.

// Einlesen der Datei "datei" in den String $str
  $str = implode("", @file("datei"));
  // Ausgeben der Datei mit Umbrüchen
  print nl2br($str); 

Sollen Zeilenumbrüche komplett ersetzt werden, benutzt man z. B. str_replace() :

$string = str_replace("\n", "<br>", $string); 

Zum Thema "Zeilenumbruch" siehe auch: " string-zeilenumbruch ".

Antwort von Johannes Frömter:

Sollte man in die Verlegenheit kommen, eine Umkehrfunktion zu nl2br() zu benötigen, muss man einen Regulären Ausdruck bemühen.

function br2nl($str) {
    return preg_replace("=<br(>|([\s/][^>]*)>)\r?\n?=i", "\n", $str);
} 

Der Ausdruck ist etwas länglich, weil er sicherstellt, dass wirklich nur <br>-Tags (die allerdings in allen Variationen!), nicht aber XML-Tags o. ä. (<brown> z.B.) umgewandelt werden - sicher ist sicher...

Frage: Wie breche ich einen String nach x Zeichen um?

Antwort von Johannes Frömter:

Ab PHP 4.0.2 gibt es die Funktion wordwrap() , um lange Strings auf eine definierte Zeilenlänge zu bringen. Als Default wird nach 75 Zeichen mit \n umgebrochen, man kann aber optional als dritten bzw. vierten Parameter auch eigene Werte angeben, was gerade bei der Ausgabe in einer HTML-Seite praktisch ist:

echo wordwrap($ganzLangerText, 25, "<br>", 1); 

Der vierte Parameter cut ist in PHP 4.0.3 hinzugekommen, er bewirkt, dass der String auf jeden Fall (auch mitten in einem Wort) umgebrochen wird. Hinweis: der Parameter cut sollte möglichst immer gesetzt werden, es gab einige PHP-Versionen, in denen wordwrap() bei Wörtern mit einer Länge > width sonst in einer Endlosschleife landet.

Kann man wordwrap() nicht benutzen, helfen frei verfügbare Scripte wie z.B. textwrap von Brian Moon.

Frage: Wie kann ich einen String kürzen?

Antwort von Johannes Frömter:

Im einfachsten Fall erreicht man dies mit der "Allround-Funktion" substr() (weitere Beispiele im Manual):

// Die ersten 20 Zeichen von $string ausgeben:
echo substr($string, 0, 20); 

Soll die Ausgabe nicht mitten in einem Wort unterbrochen werden, bietet es sich an, die Funktion wordwrap() zu "missbrauchen":

// Nur ganze Wörter, max. 20 Zeichen von $string ausgeben:
$parts= explode("\n", wordwrap($string, 20, "\n"));
echo $parts[0]; 

Hier wird an der gewünschten Stelle ein Zeilenumbruch durch wordwrap() eingefügt, anschliessend der String an den Zeilenumbrüchen in Arrays von Strings zerlegt und schliesslich das erste Array-Element ausgegeben.

Frage: Wie kann ich einen String als PHP-Code ausführen?

Antwort von Johannes Frömter:

Mit der Funktion eval() kann man PHP-Code, der in einer Variablen als String vorliegt, ausführen lassen. eval() schaltet direkt in den PHP-Modus, d. h. PI-Tags (processing instructions, üblicherweise <?php und ?> ) müssen im String nicht enthalten sein. Der String darf aber PIs enthalten, um vom PHP- in den HTML-Modus (und zurück) zu wechseln; beginnt der String mit HTML, so ist zuerst ein schließender PI-Tag nötig:

$html_php_mix = '<h1> <?php echo "GROSS"; ?> </h1>';
eval("?> $html_php_mix <?php "); 

Der öffnende PI-Tag zum Schluss ist nicht unbedingt notwendig - wenn man ihn schreibt, dann allerdings ist das Leerzeichen danach wichtig. Alle PHP-Anweisungen müssen korrekt mit einem Semikolon beendet werden (in normalem PHP-Code darf das Semikolon nach der letzten Anweisung fehlen).

Achtung: Der Funktion eval() darf man nur absolut vertrauenswürdigen Code übergeben; Code aus unbekannter Quelle kann äußerst gefährliche Befehle wie z.B. unlink($_SERVER['PHP_SELF']) , mysql_drop_db() oder system() enthalten und großen Schaden anrichten.