Wenn ein Blog schon eine Weile läuft, sammeln sich einige Links an. Und wie das halt so ist, bestehen davon so manche nicht den Test der Zeit. Um über geparkte Domains nicht auf schmuddlige Casino- oder sonstige Spam-Seiten zu verweisen, wäre es natürlich hübsch, die Links regelmäßig mal durchzuchecken.
Also filtere ich alle URLs aus jedem Post und sammle sie in einer Tabelle, die neben der Original-URL eine Ersatz-URL enthält. Das passiert automatisch beim Speichern eines Posts und initial mit einem kleinen Command, der das einmal für alle Posts macht. Ich hatte keine Lust, meine zigtausend Posts alle einmal zu speichern. Ein Cronjob geht nun her und knöpft sich alle halbe Stunde ein paar Hände voll URLs vor, prüft sie und sucht notfalls eine Ersatz-URL. In den meisten Fällen ist das ein Link auf die Wayback Machine.
Beim Generieren der Seiten werden die URLs aus den Posts bei Bedarf gegen ihre Ersatz-URLs getauscht.
Das ist nicht mein erster Versuch, defekten Links Herr zu werden. Aber es ist der erste, der vollkommen automatisch läuft. Und ich kann durch sukzessive Optimierung des Linkchecks die Ergebnisse verbessern, da ich nach Entfernen der Ersatz-URL immer wieder mit der Original-URL testen kann.
return preg_replace_callback(
pattern: '~(<a\s[^>]*?href=")(https?://[^"]+)(")~i',
callback: fn(array $matches) => isset($this->replacements[$matches[2]])
? $matches[1]
.htmlspecialchars(
string: $this->replacements[$matches[2]],
double_encode: false
)
.$matches[3]
: $matches[0],
subject: $html
) ?? $html;
Alles in allem dreht sich die Ersetzung um einen Aufruf von preg_replace_callback(). $html ist offensichtlich der HTML‑Code und $this->replacements ist ein Array, das die Original-URLs als Schlüssel und den Ersatz als Wert hat. Beim ersten Aufruf wird $this->replacements einmal initialisiert, sodass der Renderer beliebig viele Posts oder Seiten ohne weiteren Query verarbeiten kann.