Umlaute und Sonderzeichen aus Strings entfernen
Quell-ID: GitHub Discussion #31
Use Case
Ein String mit Umlauten und Sonderzeichen soll normalisiert werden, um ihn als Dateinamen oder HTML-Anker (ID) verwenden zu können.
Verwendete AddOns
- REDAXO Core
Beispiele
Eingabe: "wichtige-Datön&Fäkten.pdf"
Ausgabe: "wichtige_datoen_faekten"
Eingabe: "Sprüng-Märke"
Ausgabe: "sprueng_maerke"
Lösung
REDAXO bietet die Funktion rex_string::normalize():
<?php
$fileName = rex_string::normalize('wichtige-Datön&Fäkten');
// Ergebnis: "wichtige_datoen_faekten"
Anwendung als HTML-Anker
<?php
$anchor = rex_string::normalize('Sprüng-Märke');
?>
<a href="#<?= $anchor ?>">Zum Abschnitt springen</a>
<div id="<?= $anchor ?>">
Inhalt des Abschnitts
</div>
Verhalten von rex_string::normalize()
Die Funktion:
- Konvertiert Umlaute (ä → ae, ö → oe, ü → ue, ß → ss)
- Entfernt Sonderzeichen
- Ersetzt Leerzeichen und Bindestriche durch Unterstriche
- Konvertiert in Kleinbuchstaben
- Entfernt mehrfache Unterstriche
Weitere String-Funktionen
rex_string::sanitizeHtml()
Bereinigt HTML für sichere Ausgabe:
$safe = rex_string::sanitizeHtml($unsafeHtml);
rex_string::buildQuery()
Erstellt einen URL-Query-String:
$query = rex_string::buildQuery(['page' => 1, 'sort' => 'name']);
// Ergebnis: "page=1&sort=name"
rex_string::highlight()
Hebt Suchbegriffe hervor:
$text = rex_string::highlight($text, $searchTerm, '<mark>$1</mark>');
Besserer Ansatz für spezifische Anwendungsfälle
Für Dateinamen
<?php
function sanitizeFilename(string $filename): string
{
// Dateiendung extrahieren
$extension = pathinfo($filename, PATHINFO_EXTENSION);
$basename = pathinfo($filename, PATHINFO_FILENAME);
// Basisnamen normalisieren
$sanitized = rex_string::normalize($basename);
// Mit Dateiendung zurückgeben
return $sanitized . ($extension ? '.' . strtolower($extension) : '');
}
// Verwendung
$cleanName = sanitizeFilename('Mein Dokument (v2).PDF');
// Ergebnis: "mein_dokument_v2.pdf"
Für URL-Slugs mit Bindestrichen
<?php
function createSlug(string $text): string
{
// Erst normalisieren
$slug = rex_string::normalize($text);
// Unterstriche durch Bindestriche ersetzen
$slug = str_replace('_', '-', $slug);
// Mehrfache Bindestriche entfernen
return preg_replace('/-+/', '-', $slug);
}
// Verwendung
$slug = createSlug('Mein schöner Artikel-Titel!');
// Ergebnis: "mein-schoener-artikel-titel"
Für HTML-IDs (streng)
<?php
function createHtmlId(string $text): string
{
$id = rex_string::normalize($text);
// IDs dürfen nicht mit einer Zahl beginnen
if (preg_match('/^[0-9]/', $id)) {
$id = 'id-' . $id;
}
return $id;
}
Hinweis
rex_string::normalize() ist speziell für deutsche Umlaute optimiert. Für andere Sprachen oder komplexere Anforderungen kann die PHP-Intl-Extension mit Transliterator verwendet werden:
<?php
$transliterator = Transliterator::create('Any-Latin; Latin-ASCII; Lower()');
$ascii = $transliterator->transliterate('Müller Ñoño');
// Ergebnis: "muller nono"