maettig.com

Thiemos Archiv

Die Akronym- und Abkürzungs-Erkennung in diesem Tagebuch ist – meiner bescheidenen Meinung nach – so schnell, dass sie sich problemlos sogar in Echtzeit auf ganze Texte anwenden lässt. Ein Dokument von einem MB Größe ist in einer Sekunde abgearbeitet und mit den kleinen aber feinen Erläuterungen ausstaffiert. Vergleichbare Algorithmen sind zwar einfacher zu lesen, erkennen aber manchmal zu viel oder zu wenig und sind oft um Größenordnungen langsamer (Matthew: 20 Sekunden, CodeMonkeyX: 30 Sekunden, michael v: 140 Sekunden).

Los geht es wie bei allen Algorithmen mit einer Liste möglicher Akronyme.

$acronyms = array(
  "IP" => "Internet Protokoll",
  "PHP" => "PHP Hypertext Preprocessor");
$pattern = '{<(head|script)\b.+?</\1>|<[^>]*>|(?<!\w)(' .
  implode('|', array_keys($acronyms)) . ')(?!\w)}sS';

Aus den Schlüsseln der Liste wird ein einziger großer regulärer Ausdruck zusammengesetzt, den man sich im Prinzip so vorstellen kann: (IP|PHP). Die beiden !\w sorgen dafür, dass dabei nur ganze Worte gefunden werden und nicht zum Beispiel »VIP«. Das Segment <[^>]* ist Teil des in der PHP-FAQ beschriebenen Tricks, mit dem sich HTML-Tags von der Akronym-Erkennung ausschließen lassen. Die Liste der explizit auszuschließenden Elemente kann bei Bedarf zum Beispiel um applet|object|select|textarea oder auch um a erweitert werden, wenn man keine Akronyme innerhalb von Linkbeschriftungen wünscht.

Als nächstes wird eine Rückruffunktion benötigt, die die Ersetzungsarbeit übernimmt.

function acronymCallback($matches)
{
  global $acronyms, $callbackDone;
  if (empty($matches[2]) || isset($callbackDone[$matches[0]]))
  {
    return $matches[0];
  }
  else
  {
    $callbackDone[$matches[0]] = true;
    return '<acronym title="' . $acronyms[$matches[0]] . '">' .
      $matches[0] . '</acronym>';
  }
}

Jetzt kann das Ganze beliebig oft aufgerufen werden.

$callbackDone = array();
$text = preg_replace_callback($pattern, "acronymCallback", $text);

Das Array $callbackDone sorgt dafür, dass jedes Akronym nur ein einziges Mal an der Stelle seines ersten Auftretens markiert wird. Das Zurücksetzen dieses Arrays ist nur notwendig, wenn die Funktion auf mehrere voneinander unabhängige Texte angewandt werden soll.

Ich bin begeistert wieviel in dem kleinen effizienten Skript drinsteckt =)
Grandios ;) Ich bin begeistert.
Aarakast

Kommentare zu diesem Beitrag können per E-Mail an den Autor gesandt werden.

[ ← Zurück zur Übersicht ]

Impressum & Datenschutz