Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 Unit Test Generator
 TLD Liste
 Webkatalog‑Verzeichnis

Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
 
 
 

Suchen und Ersetzen innerhalb von PHP

Sie befinden sich: Home > Php > Suchen und Ersetzen innerhalb von PHP

Für das Suchen und Ersetzen gibt es verschiedene Möglichkeiten innerhalb von PHP. Wir möchten Ihnen vor allem folgende Methoden aufzeigen:

ereg_replace(), str_replace() und preg_match(). Zunächst möchten wir Ihnen diesen drei Methoden näher bringen, um Ihnen danach anhand von Quelltexten Ihnen die Funktionsweise aufzuzeigen.

I. ereg_replace() (veraltet)

Wichtiger Hinweis: Die Funktion ereg_replace() wurde in PHP 7.0 entfernt und ist nicht mehr verfügbar. Verwenden Sie stattdessen preg_replace() oder str_replace(). Die folgenden Beispiele dienen nur noch der Dokumentation.

ereg_replace war eine Methode, welche innerhalb eines Textes ein von Ihnen bestimmtes Suchwort suchte und dieses gegen ein von Ihnen gewünschtes Wort ersetzene.


Beachten Sie bitte dabei folgende Aspekte: Es ist wichtig, dass man bei Benutzung dieser Methode auf die Groß- und Kleinschreibung des zu suchenden Wortes achtet, denn diese Funktion unterscheidet dazwischen. So wird bei dem Suchwort 'bin' jedes Großgeschriebene 'BIN' im Text übergangen. Als weiteres gilt, dass wenn sie Zahlen ausgetauscht haben möchten, dass Sie diese in Hochkommas setzen, damit das Programm die Zahl nicht als eigenständige Zahl, sondern als Zeichen erkennt, denn nur dann kann es dieses auch als Ersetzungsmöglichkeit anerkennen.

Die Function ereg_replace() wird wie folgt aufgerufen:

<?php
$neuer_text = ereg_replace('zu suchender Text',
'ersetzender Text', $alter_text);
?>

Quelltext-Beispiel:

<?php
echo 'Hier ein Beispiel, dass Zahlen
hier leider nicht so genutzt werden können<br>';
$zahl = 5;
$txt = 'Auf der Weide vor
meinem Haus stehen fünf Schafe<br>';
echo $txt;
$txt = ereg_replace('fünf', $zahl, $txt);
echo $txt;
?>

Ausgabe :

Hier ein Beispiel, dass Zahlen hier leider nicht so genutzen werden können
Auf der Weide vor meinem Haus stehen fünf Schafe
Auf der Weide vor meinem Haus stehen  Schafe




Schreiben wir nun die gewünschte Zahl in Hochkommas, damit sie als Zeichen und nicht als Zahl erkannt wird, wird das Wort fünf durch die Ziffer 5 ersetzen.

Beispiel :

<?php
echo 'Hier ein Beispiel, dass Zahlen
hier leider nicht so genutzt werden können<br>';
$zahl = '5';
$txt = 'Auf der Weide vor
meinem Haus stehen fünf Schafe<br>';
echo $txt;
$txt = ereg_replace('fünf', $zahl, $txt);
echo $txt;
?>
Ausgabe :

Hier ein Beispiel, dass Zahlen hier leider nicht so genutzen werden können
Auf der Weide vor meinem Haus stehen fünf Schafe
Auf der Weide vor meinem Haus stehen 5 Schafe

II. str_replace()

Auch str_replace sucht aus einer Ansammlung von Zeichen sich den gewünschten Wortlaut oder Buchstaben raus und ersetzen ihn durch einen Neuen. Auch hier gilt auf die genaue Groß- und Kleinschreibung zu achten, damit die Methode all die von Ihnen gewünschten Worte finden kann.

Die Syntax hierzu lautet :

<?php
$neuer_text = str_replace("gesuchter Text", "Ersetzung_durch", "Zeichenfolge");
?>

Quelltext-Beispiel:

<?php
$wort = "Klettergerüst";
echo str_replace("Kletter", "Kinder", $wort);
?>
Ausgabe:

Kindergerüst

Natürlich kann man auch die Abfrage mit Arrays machen. Man braucht dabei zwei Arrays. Das erste Array enthält die zu suchenden Wörter. Das zweite Wort enthält die Wörter, die die alten Wörter ersetzen soll. Beachten Sie bitte dabei, dass Sie das gesuchte Wort und das Wort das Sie dadurch auswechseln wollen in beiden Arrays an dieselbe Stellen Sie im Array schreiben!

Beispiel :

<?php
$text = "In diesen Test möchten wir die ";
$text .= "Wörter: Sonne, Flut und Erde ersetzen.<br>";
echo $text;

/**
* $array_suche zusammen bauen
*/
$array_suche[0] = "Erde";
$array_suche[1] = "Sonne";
$array_suche[2] = "Flut";

/**
* $array_ersetzen  zusammen bauen
*/
$array_ersetzen[0] = "Sand";
$array_ersetzen[1] = "Mond";
$array_ersetzen[2] = "Ebbe";

$neuer_text = str_replace($array_suche, $array_ersetzen,
$text);
echo $neuer_text;
?>

Ausgabe:

In diesen Test möchten wir die Wörter: Sonne, Flut und Erde ersetzen.
In diesen Test möchten wir die Wörter: Mond, Ebbe und Sand ersetzen.

Achten Sie nicht auf die Reihenfolge bei den Array`s, kann es dazu kommen, dass Sie nicht das erwünschte Ergebnis bekommen. Mann kann natürlich jedes Array Element einzeln ersetzen, das könnte man z.b. mit eine for() Schleife machen.

Dazu möchten wir Ihnen ein weiteres Beispiel aufzeigen:

<?php
$text = 'Wenn ich wüsste was ich möchte, ';
$text .= 'wäre die Entscheidung nur halb <br>';
echo $text;
$zeichen = array("ü", "ö", "ä");
$ersetzen = array("ue", "oe", "ae");
/**
* Mit einer for() Schleife jedes Zeichen
* einzeln ersetzten.
*/
for ($x = 0; $x < 3; $x++) {
    $text = str_replace($zeichen[$x], $ersetzen[$x],
$text);
    echo $text;
}
?>

Ausgabe:

Wenn ich wüsste was ich möchte, wäre die Entscheidung nur halb
Wenn ich wuesste was ich möchte, wäre die Entscheidung nur halb
Wenn ich wuesste was ich moechte, wäre die Entscheidung nur halb
Wenn ich wuesste was ich moechte, waere die Entscheidung nur halb
Wenn ich wuesste was ich moechte, waere die Entscheidung nur halb

Natürlich muss man nicht unbedingt eine for Schleife verwenden um z.B. mehrere Buchstaben zu ersetzen. Man hat bei der Funktion str_replace() mit der Verbindung array_keys() und array_values() die Möglichkeit, mehrere Buchstaben zu ersetzen. Nachfolgend finden sie ein Beispiel, womit man bei einem Dateinamen, alle Umlaute sowie Sonderzeichen ersetzen kann.

Beispiel für Umlaute im Dateinamen ersetzen:

<?php
$filename = 'ärger müller.jpg';
$umlaute = array(
'ä' => 'ae',
'Ä' => 'ae',
'ß' => 'ss',
'ö' => 'oe',
'Ö' => 'oe',
'ü' => 'ue',
'ü' => 'ue',
' ' => '-',
'à' => 'a',
'è' => 'e',
'ê' => 'e'
);
$filename = str_replace(array_keys($umlaute),
array_values($umlaute), $filename);
echo $filename;
?>

Ausgabe:

aerger-mueller.jpg

Eine weitere Erklärung der PHP-Funktion str_replace() finden Sie in unserer Tutorial Datenbank. Bei dieser Erklärung, wird erklärt wie man "Das Vorkommen eines Zeichens in einer Zeichenkette suchen und mit einer eigenen String ersetzen" kann.

III. preg_match()



Über preg_match() lässt man innerhalb eines Textes nach einem gewünschten regulären Ausdruck suchen und die gefundene Treffer anzahl zu protokolieren.

Syntax :

<?php
$neuer_text = preg_match(
'Zu suchender Ausdruck',
'innerhalb dieses Textes',
$rueckgaben_array,
PREG_OFFSET_CAPTURE,
$offset);
?>

Quelltext-Beispiel mit der Angabe von PREG_OFFSET_CAPTURE:

<?php
$text = "Affenschaukel";
$suche = '/^schaukel/';
preg_match($suche, substr($text, 5), $array,
PREG_OFFSET_CAPTURE);
print_r($array);
?>

Es würde nun folgende Ausgabe erzeugt werden:

Array
(
    [0] => Array
        (
            [0] => schaukel
            [1] => 0
        )
)

Quelltext-Beispiel ohne der Angabe von PREG_OFFSET_CAPTURE:

<?php
$text = "ersttextunddannzahl716767diesertextwirdnichtgefunden";
$suche = '/([a-zA-Z]{1,4})([0-9]{1,7})/is';
preg_match($suche, $text, $array);
print_r($array);
?>

Ausgabe:

Array
(
   [0] => zahl716767
   [1] => zahl
   [2] => 716767
)


Desweiteren möchten wir Sie auf Sonderzeichen aufmerksam machen. Unlesbare Sonderzeichen treten ungewollt auf, wenn man zum Beispiel beim Aufbau seiner Homepage auf das Charset UTF-8 benutzen. Dabei werden alle Umlaute oder andere Sonderzeichen, wie Punkte, Komma, Backslashs usw ,in “named entities” übersetzen werden und dadurch kaum noch zu lesen, sondern nur noch zu erraten werden für die Leser.



ä = ä , ö = ö ..usw. natürlich kann man dieses Problem beheben, wenn man zum Beispiel eine der oben genannten Methoden benutzen um diese Zeichen auszuwechseln. Man kann natürlich dann jeden Schritt einzeln vollziehen, dies jedoch führt zu einem sehr langen, möglicherweise unübersichtlichen Quelltext mit sehr viel Arbeit führt, oder man benutzen hier bei eine Schleifenfunktion und zwei Arrays.

In dem ersten Array sollten die gesuchten Zeichenfolgen enthalten sein, in dem zweiten Array die Richtigstellung dieser Zeichenfolgen. Die Schleife sollte dann genau darauf abgestimmt sein all diese Zeichen zu erreichen und zu ersetzen, damit Ihr Text wieder für jeden klar lesbar wird.

Anm.: Alternativ kann man auch noch den PHP Befehl strtr() für den austausch von Zeichen in einer Zeichenkette mit einer Austauschliste verwenden. Dieser eignet sich besonders gut, wenn man zum Beispiel kaputte Umlaute über ein Mehrdimensionales Array innerhalb eines Textes ersetzen möchte.

str_replace vs str_ireplace: Groß- und Kleinschreibung im Griff

Die klassische str_replace()-Funktion arbeitet immer streng nach Groß- und Kleinschreibung. Suchst Sie nach "PHP", findet sie keinen einzigen Treffer in einem Satz, der nur das Wort "php" enthält. Genau hier kommt str_ireplace() ins Spiel. Das kleine i im Namen steht für insensitive und sorgt dafür, dass die Funktion Groß- und Kleinschreibung ignoriert. Vom Verhalten her ist sie ansonsten identisch zur Schwesterfunktion. Die Wahl zwischen beiden ist im Alltag oft eine Frage der Datenqualität Ihrer Eingaben.

<?php
declare(strict_types=1);

$text = 'PHP ist toll, php auch, und PhP sowieso.';

/* Strenges Ersetzen: nur exakte Schreibweise wird getroffen. */
echo str_replace('PHP', 'Python', $text);
/* Ausgabe: Python ist toll, php auch, und PhP sowieso. */

echo "\n";

/* Case-insensitive: alle Varianten werden ersetzt. */
echo str_ireplace('PHP', 'Python', $text);
/* Ausgabe: Python ist toll, Python auch, und Python sowieso. */

Achten Sie darauf, dass str_ireplace() intern aufwendiger arbeitet, weil sie für jeden Vergleich die Groß- und Kleinschreibung normalisieren muss. Bei riesigen Texten und sehr vielen Aufrufen kann das einen messbaren Unterschied machen.

str_replace mit Arrays: mehrere Suchbegriffe in einem Aufruf

Eine der unterschätzten Stärken von str_replace() ist die Array-Variante. Sie können sowohl im Such- als auch im Ersetzungs-Parameter ein Array übergeben und damit mehrere Begriffe in einem einzigen Funktionsaufruf verarbeiten. Das ist deutlich schneller als eine Schleife mit vielen Einzelaufrufen, weil PHP intern den String nur einmal durchläuft.

<?php
declare(strict_types=1);

$text = 'Hallo Welt, schoenen Tag noch!';

$suche    = ['Hallo', 'Welt', 'Tag'];
$ersetze  = ['Hi',    'Erde', 'Morgen'];

echo str_replace($suche, $ersetze, $text);
/* Ausgabe: Hi Erde, schoenen Morgen noch! */

Ein Stolperstein lauert in der Reihenfolge der Ersetzungen. PHP arbeitet das Such-Array von vorn nach hinten ab und wendet jeden Treffer sichekt auf den bereits veränderten String an. Wenn ein späteres Suchwort durch eine frühere Ersetzung erst entsteht, wird es ebenfalls gefunden. In solchen Fällen ist strtr() mit einem assoziativen Array die sicherere Wahl, weil dort jede Ersetzung nur einmal greift und parallel statt sequentiell läuft.

preg_replace: Regex für Muster statt fester Begriffe

Sobald Sie nicht mehr nach festen Strings suchen, sondern nach Mustern, ist preg_replace() Ihr Werkzeug. Die Funktion akzeptiert einen regulären Ausdruck als Suchmuster und kann damit Dinge erledigen, an denen str_replace() scheitert. Das volle Spektrum zeigt das Tutorial zu preg_replace().

<?php
declare(strict_types=1);

$text = 'Telefon: 0211 / 123-456-789';

/* Alle nicht-Ziffern entfernen. */
echo preg_replace('/[^0-9]/', '', $text);
/* Ausgabe: 0211123456789 */

/* Mehrfach-Whitespace zu einem Leerzeichen normalisieren. */
$schmutz = "Hallo    Welt\n\n   PHP";
echo preg_replace('/\s+/', ' ', $schmutz);
/* Ausgabe: Hallo Welt PHP */

Achten Sie auf die Performance-Falle. Reguläre Ausdrücke sind mächtig, aber für simple Suchen deutlich langsamer als str_replace(). Für Validierung statt Ersetzung greifst Sie sinnvoller zu preg_match() oder zur Zerlegung mit preg_split().

preg_replace_callback: dynamische Ersetzung pro Treffer

Manchmal reicht ein statischer Ersetzungs-String nicht aus. Sie wollen pro Treffer eine eigene Logik laufen lassen, etwa eine Berechnung, eine Datenbankabfrage oder eine Formatierung. Genau dafür gibt es preg_replace_callback(). Statt eines festen Ersetzungstextes übergeben Sie eine Funktion, die für jeden Treffer aufgerufen wird und das Match-Array bekommt. Was sie zurückgibt, ersetzen den Treffer im Original-String. Die ausführliche Variante mit allen Optionen finden Sie im Tutorial zu preg_replace_callback().

<?php
declare(strict_types=1);

$text = 'Preise: 10 EUR, 25 EUR und 99 EUR.';

$brutto = preg_replace_callback(
    '/(\d+)\s+EUR/',
    static function (array $match): string {
        $netto  = (int) $match[1];
        $brutto = (int) round($netto * 1.19);
        return $brutto . ' EUR';
    },
    $text
);

echo $brutto;
/* Ausgabe: Preise: 12 EUR, 30 EUR und 118 EUR. */

Der Callback bekommt ein Match-Array, in dem Index 0 den kompletten Treffer und alle weiteren Indizes die Capture-Gruppen enthalten. Typische Anwendungen sind Markdown-Konvertierung, Template-Engines, Smiley-Ersetzung oder das Anonymisieren personenbezogener Daten.

strtr: blitzschnelles Multi-Replace ohne Reihenfolge-Stress

Wer mehrere Ersetzungen in einem Rutsch erledigen will und dabei Probleme mit der Reihenfolge umgehen möchte, greift zu strtr(). Die Funktion arbeitet mit einem assoziativen Array aus Such- zu Ersetzungswerten und läuft dabei intern sehr schnell. Der große Unterschied zu str_replace() mit Arrays: strtr() wendet jede Ersetzung nur ein einziges Mal pro Position an. Tiefer steigst Sie im Tutorial zu strtr() ein.

<?php
declare(strict_types=1);

$mapping = [
    'A' => 'B',
    'B' => 'C',
];
echo strtr('AB', $mapping);   /* Ausgabe: BC, wie erwartet */
echo str_replace(['A', 'B'], ['B', 'C'], 'AB'); /* Ausgabe: CC! */

Das letzte Beispiel zeigt anschaulich, warum strtr() bei Template-Engines und Variablen-Ersetzung die bessere Wahl ist. Aus A wird B, dieses neue B wird bei str_replace() dann erneut zu C umgeschrieben. strtr() dagegen ersetzen jede Position genau einmal, ganz unabhängig davon, was die Ersetzung produziert.

substr_replace: positionsbasiertes Ersetzen ohne Suchen

Manchmal wissen Sie genau, an welcher Position im String etwas geändert werden muss, und müssen gar nicht erst suchen. Genau hier setzen substr_replace() an. Die Funktion bekommt einen Start-Offset und eine Länge und ersetzen das Stück dazwischen durch Ihren neuen Wert.

<?php
declare(strict_types=1);

$kreditkarte = '4539123456789012';

/* Mittlere acht Ziffern durch Sterne ersetzen. */
$maskiert = substr_replace($kreditkarte, '********', 4, 8);
echo $maskiert;
/* Ausgabe: 4539********9012 */

/* Etwas einfuegen, ohne zu loeschen: Laenge auf 0 setzen. */
$satz = 'Hallo Welt';
echo substr_replace($satz, ' liebe', 5, 0);
/* Ausgabe: Hallo liebe Welt */

Die Funktion ist die mit Abstand schnellste der hier vorgestellten Replace-Varianten, weil sie weder suchen noch vergleichen muss. In Kombination mit strpos() oder strlen() entstehen daraus aber sehr effiziente Manipulations-Pipelines.

Performance-Vergleich: was wann am schnellsten ist

Die Frage nach der schnellsten Replace-Funktion lässt sich nicht pauschal beantworten, aber es gibt eine grobe Hierarchie. Ganz oben stehen strtr() mit assoziativem Array und substr_replace() bei bekannter Position. Beide arbeiten ohne aufwendige Suche und sind extrem schnell. Sichekt dahinter folgt str_replace(), das in C implementiert ist und kein Regex-Parsing benötigt. Deutlich langsamer sind die preg_*-Funktionen, weil sie Muster kompilieren und mit dem PCRE-Backend arbeiten müssen.

<?php
declare(strict_types=1);

$text  = str_repeat('Hallo Welt, das ist ein Test. ', 5000);
$start = hrtime(true);

$out = str_replace(['Hallo', 'Welt', 'Test'], ['Hi', 'Erde', 'Versuch'], $text);
$t1  = (hrtime(true) - $start) / 1e6;

$start = hrtime(true);
$out = strtr($text, [
    'Hallo' => 'Hi',
    'Welt'  => 'Erde',
    'Test'  => 'Versuch',
]);
$t2 = (hrtime(true) - $start) / 1e6;

echo sprintf("str_replace: %.2f ms\nstrtr: %.2f ms\n", $t1, $t2);

Wichtig ist die Aussage: Wenn Sie keine Muster brauchen, vermeide Regex. Sie verlierst dadurch nicht nur Geschwindigkeit, sondern auch Lesbarkeit, weil Regex-Patterns für Aussenstehende oft kryptisch wirken. Mehr zur Messung von Laufzeiten finden Sie im Tutorial zu microtime() und hrtime().

Mermaid: Wann welche Funktion?

Bei der Auswahl der richtigen Replace-Funktion hilft eine kleine Entscheidungsskizze. Die wichtigste Frage ist immer: Suchst Sie nach festen Begriffen oder nach einem Muster? Daran hängen alle weiteren Entscheidungen.

flowchart TD
    A[Was willst du ersetzen?] --> B{Festes Wort oder Muster?}
    B -- Festes Wort --> C{Eine oder mehrere?}
    B -- Muster --> D{Statisch oder dynamisch?}
    C -- Eine --> E[str_replace]
    C -- Mehrere --> F[strtr]
    D -- Statisch --> G[preg_replace]
    D -- Dynamisch --> H[preg_replace_callback]

Die Skizze deckt die häufigsten Fälle ab. Bei festen Suchbegriffen reicht str_replace() oder bei mehreren Ersetzungen strtr(). Sobald Muster ins Spiel kommen, wird Regex nötig. Statische Ersetzung übernimmt preg_replace(), dynamische Logik pro Treffer regelt preg_replace_callback().

Praxisbeispiel: Markdown-zu-HTML Mini-Konverter

Zum Abschluss bringen wir alle Konzepte in einem realen Mini-Projekt zusammen. Wir bauen einen einfachen Markdown-zu-HTML-Konverter, der die wichtigsten Auszeichnungen versteht und dabei alle vorgestellten Funktionen in ihrer typischen Rolle einsetzen.

<?php
declare(strict_types=1);

function markdownToHtml(string $md): string
{
    /* 1. Erst HTML-Sonderzeichen sicher escapen. */
    $html = htmlspecialchars($md, ENT_QUOTES | ENT_HTML5, 'UTF-8');

    /* 2. preg_replace_callback fuer Code-Bloecke (dynamisch). */
    $html = preg_replace_callback(
        '/```(.*?)```/s',
        static function (array $m): string {
            return '<pre><code>' . trim($m[1]) . '</code></pre>';
        },
        $html
    );

    /* 3. preg_replace fuer Inline-Muster (statisch, mit Backrefs). */
    $html = preg_replace('/\*\*(.+?)\*\*/', '<strong>$1</strong>', $html);
    $html = preg_replace('/\*(.+?)\*/',           '<em>$1</em>',     $html);

    /* 4. preg_replace fuer Header. */
    $html = preg_replace('/^### (.+)$/m', '<h3>$1</h3>', $html);
    $html = preg_replace('/^## (.+)$/m',  '<h2>$1</h2>', $html);
    $html = preg_replace('/^# (.+)$/m',   '<h1>$1</h1>', $html);

    /* 5. strtr fuer simple Smiley-Ersetzung (multi-replace). */
    $html = strtr($html, [':)' => 'happy', ':(' => 'sad']);

    /* 6. str_replace fuer Zeilenumbrueche zu br. */
    $html = str_replace("\n", "<br>\n", $html);

    return $html;
}

Der Konverter zeigt jede Funktion in ihrer Stärke. htmlspecialchars() sorgt für sichere Ausgabe, preg_replace_callback() übernimmt die dynamische Code-Block-Verarbeitung mit Trimming, preg_replace() erledigt die statischen Backreference-Muster für Bold, Italic und Headlines. strtr() ersetzen die Smileys parallel und ohne Reihenfolge-Probleme, und das abschliessende str_replace() ist die schnellste Wahl für die einfache Newline-zu-br-Konvertierung.

Wenn Sie diesen Konverter erweitern wollen, können Sie Listen, Links und Tabellen ergänzen, Bilder einbauen oder das Ergebnis durch strip_tags() mit einer Allowlist filtern. Wichtig ist nur, dass Sie sich bei jeder neuen Regel kurz die Frage aus der Mermaid-Skizze stellst. Festes Wort oder Muster, eine oder mehrere Ersetzungen, statisch oder dynamisch.




weiter zum nächsten Kapitel: PHP Sessions