Barrierefreiheit: Ersetzen von Acronymen und Abkürzungen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Barrierefreiheit: Ersetzen von Acronymen und Abkürzungen

    Hallo!

    Ich sitze hier gerade vor einem kleinen Skript, das mich in der Richtung Barrierefreiheit
    ein wenig weiter bringen soll und einiges (lästiges) automatisieren soll.

    Ziel des Skriptes ist es, im Text vorkommende Abkürzungen oder Acronyme in
    die entsprechende HTML/XHTML-Variante zu bringen. Also ganz nach dem Motto "HTML"
    wird zu <acronym title="Hypertext Markup Language" lang="en">HTML</acronym> usw.

    Dazu habe ich eine Tabelle erstellt, in der alle notwendigen Informationen
    gespeichert werden. Im Einzelnen sind das:
    id: laufende ID (= Primärschlüssel)
    abkuerzung: Abkürzung (z.B. HTML, XHTML etc)
    erklaerung: Erklärung der Abkürzung (also Hypertext Markup Language usw.)
    art: Art der Abkürzung (derzeit definiert: acronym, abbr, span, dfn)
    sprache: Sprache der Erklärung (derzeit definiert: de, en, fr)
    zeitstempel: UNIX-Timestamp, wann der Eintrag angelegt wurde (hat derzeit noch keine Verwendung)

    Um nun einen entsprechenden Text zu analysieren und umzuwandeln, habe ich dann
    folgende Funktion geschrieben:

    PHP-Code:
    function getAbbrev($trans) {
        global 
    $database;
        
        
    $sql "SELECT * FROM abbrev ORDER BY abkuerzung ASC";
        
    $erg =& $database->query($sql);
        
    $abr $erg->fetchAll(MDB2_FETCHMODE_ASSOC);
        
        for (
    $a 0$a sizeof($abr); $a++) {
            if (
    $abr[$a]["art"] == "span") {
                
    $trans str_replace($abr[$a]["abkuerzung"],"<"
    .$abr[$a]["art"]." lang=\"".$abr[$a]["sprache"]."\">"
    .$abr[$a]["abkuerzung"]."</".$abr[$a]["art"].">"$trans);
            } else {
                
    $trans str_replace($abr[$a]["abkuerzung"],"<"
    .$abr[$a]["art"]." title=\"".$abr[$a]["erklaerung"]
    .
    "\" lang=\"".$abr[$a]["sprache"]."\">"
    .$abr[$a]["abkuerzung"]."</".$abr[$a]["art"].">"$trans);
            }
        }
        return (
    $trans);

    Anmerkungen dazu:
    Mit $trans wird der Text übergeben, der übersetzt werden soll.
    Die Unterscheidung von "span" ist wichtig, um einen Sprachwechsel zu markieren
    (ist so in der BITV gefordert).
    Zum Ersetzen wird einfach die Funktion str_replace benutzt.

    Der Text wird nun umgewandelt und dann wieder in die Datenbank geschrieben.
    Wenn der Text dann neu bearbeitet wird, werden derzeit mit strip_tags alle
    HTML-Elemente aus dem Text entnommen und dann der Text neu analysiert, wenn
    er wieder in die Datenbank geschrieben wird.

    Was sind nun meine Probleme damit:

    Zunächst gibt es ein Problem, wenn ich gleichlautende Abkürzungen habe (z.B.
    XHTML und HTML). Bei der Funktion str_replace wird nun sowohl "HTML", als auch
    "XHTML" ersetzt, was dann zu einem etwas komischen und nicht richtigen Ergebnis
    führt, da es zu einer Verschachtelung von acronym kommt, was nicht
    beabsichtigt und gewollt ist.

    Des weiteren macht die strip_tags-Funktion Probleme, da auch alle HTML-
    Formatierungen damit flöten gehen. Wurden also komplexe Tabellen oder
    Listen usw. erstellt, dann sind die auch weg. Ich weiß, dass man strip_tags ne
    Liste von HTML-Elementen übergeben kann, die es stehen lassen soll. Gibt
    es so was auch für den umgekehrten Fall, sprich ich sag der Funktion, was sie
    löschen soll (wäre durchaus einfacher). Noch besser wäre natürlich eine
    Funktion, die überprüft, ob es schon eine Umwandlung gibt und überprüft die
    nur noch auf Richtigkeit (sollte sich in der Datenbank was geändert haben
    o.ä. Schreibfehler passieren immer mal ;-)).

    Die Funktion getAbbrev soll am Ende einen langen Text durch gehen und prüfen,
    ob die in der Datenbank gespeicherten Abkürzungen vorkommen und diese
    dann durch die Informationen in der Datenbank ersetzen. Eine Abfrage,
    ob Groß-/Kleinschreibung wichtig ist, wäre vielleicht auch noch sinnvoll (kann
    man ja auch noch entsprechend in der Datenbank hinterlegen).

    Über Eure Hilfe und Kommentare wäre ich sehr dankbar. Alle, die sich mit
    Barrierefreiheit beschäftigen wissen ja, welche Grausamkeiten es
    dort gibt, und vielleicht kann man damit ein paar Sachen gut automatisieren.

    Vielen Dank für Eure schnelle Hilfe!

    Viele Grüße

    Michael
    EDIT:
    Text gebrochen ;-)
    Zuletzt geändert von mruckcws; 21.08.2006, 08:43.

  • #2
    BOAH!!!
    brech ma deinen Text um, dann les ich das auch ...
    Signatur-Text ...

    Kommentar


    • #3
      statt str_replace ein preg_replace mit /b vorne und hinten vor dem Akronym

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        Also würde die Anweisung dann so heißen:

        PHP-Code:
        preg_replace("/b".$abr[$a]["abkuerzung"]."/b", ... 
        Hmmmm, schön, aber was macht das "/b"? Bzw. welchem Kriterium entspricht das?

        Ist hiermit auch die Groß-/Kleinschreibung und auch das mit XHTML / HTML abgedeckt?

        Vielen Dank für die Aufklärung, aber den "/b"-Schalter in RegExp kenn ich nicht :-(

        Kann ich damit auch irgendwie gezielt die Tags für die Acronyme aus einem Text wieder raus nehmen, in dem evt. auch andere HTML-Tags drin sind (anstatt von strip_tags)?

        Vielen Dank für die Hilfe!!

        Viele Grüße
        Michael

        EDIT:
        Scheint eh net zu funzen. Hab es eben mal in das Skript eingebunden und bei mir kommt dann nur "Warning: preg_replace() [function.preg-replace]: Unknown modifier 'b'" :-(
        Zuletzt geändert von mruckcws; 21.08.2006, 09:49.

        Kommentar


        • #5
          Ein wenig mehr solltest du dich mit regulären Ausdrücken schon beschäftigen, wenn du sie einsetzen willst - damit du mit gegebenen Tipps auch was anfangen kannst.

          Also siehe Manual und Tutorials (eins gibt's auch hier in der Tutorial-Sektion).
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            aus Performance-Siecht finde ich die Methode "->fetchAll()" in deinem Beispiel unbrauchbar.
            Ich sehe kein Sinn die Daten in ein Array zu packen, um diesen Array mit der Schleife zu durchlaufen und den zu verwerfen.
            Es ist besser wenn du einfach in einer schleife "->fetch()" aufrufst und direkt deine weitere Entscheidungen triffst
            Slava
            bituniverse.com

            Kommentar


            • #7
              @wahsaga:

              Ich kenn mich schon mit RegExp aus, nur kannte ich den b-Schalter halt noch nicht (ich hoffe Wissenslücken sind dennoch erlaubt und mir hat halt der richtige Gedanke gefehlt). Danke auf jeden Fall für Deine Hilfe.

              Hab es mittlerweile auch hinbekommen und war nur wieder schneller beim antworten und tippen. Die richtige Code-Teil lautet nun:

              PHP-Code:
              preg_replace("/\\b".$abr[$a]["abkuerzung"]."\\b/",... 
              Und das funzt auch. Dennoch würde mich interessieren, was der Schalter genau macht. Auch hier Danke für Deine Mühe und Deine Erklärung!!

              Hast Du evt. auch ne RegExp mit der ich den erzeugten HTML-Code auch wieder raus bekomme? Also anstatt des strip_tags?

              Oder kennt jemand ne Möglichkeit strip_tags beizubringen, dass er nur die Dinger löscht, die auch in der Datenbank verzeichnet sind? Wobei es dann bei dem span-Tag wieder zu Problemen kommen könnte (Müßte dann ne Abfrage rein wie: Lösche span nur, wenn auch nur das Attribut "lang" enthalten ist). Über Hinweise in diese Richtung wäre ich noch super dankbar. Würde das dann sogar in ner neuen Funktion "delAbbrev" realisieren.

              Vielen Dank hierfür!!

              @Slava:
              Danke für den Hinweis, aber zunächst mach ich mir mal keine Performance-Gedanken. Die Funktion wird derzeit eh nur beim Speichern in die Datenbank des zu analysierenden Textes verwendet und das kommt recht selten vor. So soll das auch bleiben und deswegen kann ich mit der Performance sehr gut leben.

              Dennoch vielen Dank für den Hinweis, werde ihn im Hinterkopf behalten.

              Über weitere Hinweise und Tipps bin ich Euch sehr dankbar.

              Viele Grüße
              Michael
              Zuletzt geändert von mruckcws; 21.08.2006, 12:21.

              Kommentar


              • #8
                Original geschrieben von mruckcws
                Dennoch würde mich interessieren, was der Schalter genau macht.
                Read the friendly Manual, da steht's drin.
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  Sicht= вид, зрение
                  Siech=устар. больной, бедный н.пр. больной от лепры, нетрудоспособный. Или мат современн.: нечестный человек.
                  Zuletzt geändert von jhaase; 21.08.2006, 14:02.

                  Kommentar


                  • #10
                    So, hab es jetzt prima hinbekommen und kann nun auch die Acronym- und Abbr-Tags wieder gezielt aus einem Text löschen. Auf der PHP-Seite bei strip_tags steht ein entsprechendes Skript, das genau das macht und funzt echt prima.

                    Nun bin ich aber doch noch auf ein Problem bei der Funktion getAbbrev und der Ersetzung des Textes gestossen:

                    Ich habe im Text bspw. "CD" und "CD-ROM" stehen. Die Funktion ersetzt aber stets "CD" durch das entsprechende Acronym, nie aber "CD-ROM" komplett, obwohl ich es als Abkürzung in die Datenbank aufgenommen habe. Erkennt der b-Schalter der RegExp nur ganze Wörter und keine Wörter mit Bindestrich?

                    Ich könnte natürlich her gehen und auch noch einen Eintrag für "ROM" in der Datenbank hinterlegen und das geht bestimmt auch gut, aber es entspricht meiner Meinung nach nicht der Abkürzung.

                    Wäre schön, hierfür auch noch einen entsprechenden Tipp zu bekommen. Wenn alle Code-Teile fertig sind, dann stell ich die gerne auch hier nochmal komplett zur Verfügung (gerne auch inkl. Datenbank-Dump).

                    Vielen Dank für Eure Hilfe und viele Grüße
                    Michael

                    Kommentar


                    • #11
                      - ist eine Wortgrenze, ja.

                      Aber wenn du "CD-ROM" komplett auszutauschen versuchst, sollte das keine Probleme machen - du musst nur auf die richtige Reihenfolge der Ersetzungen achten.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar

                      Lädt...
                      X