ich: alt="" zu allen <img> tags hinzufügen falls nicht vorhanden.

Hallo.

Ich dachte da an sowas wie

$temp=preg_replace('/\<img(.*)(?!alt\=".*?")/i','<img alt=""$1',$temp);

Das soll also aus <img.* einfach mal <img alt="".* aber nur wenn alt noch nicht vorhanden ist. Und genau das passiert nicht, denn es wird einfach mal überall dazu gepackt und ist dann eben auch mal doppelt vorhanden (einmal leer und einmal mit Text, wenn es denn einen gab).

Danke...

  1. Hi,

    $temp=preg_replace('/<img(.*)(?!alt=".*?")/i','<img alt=""$1',$temp);
    Und genau das passiert nicht, denn es wird einfach mal überall dazu gepackt und ist dann eben auch mal doppelt vorhanden

    natürlich, denn bei "<img " ist obige RegExp bereits erfüllt. Und wenn Du aus dem ".*" ein ".+" machst, ist sie es bei "<img s", wenn das erste Attribut "src" lautet.

    Danke...

    Regular Expressions sind *keine* Strukturparser. Eine RegExp reicht für Dein Vorhaben nicht aus.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes

    1. Lieber Cheatah,

      Regular Expressions sind *keine* Strukturparser.

      das stimmt.

      Eine RegExp reicht für Dein Vorhaben nicht aus.

      Das stimmt nicht.

      Liebe Grüße,

      Felix Riesterer.

      -- ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. @@Felix Riesterer:

        Eine RegExp reicht für Dein Vorhaben nicht aus.

        Das stimmt nicht.

        Eigentlich doch. Es sei denn, man benutzt den Begriff „regulärer Ausdruck“ fälschlicherweise auch für Suchmuster, die keine regulären Ausdrücke sind.

        Live long and prosper,
        Gunnar

        -- Das einzige Mittel, den Irrtum zu vermeiden, ist die Unwissenheit. (Jean-Jacques Rousseau)
        1. Lieber Gunnar,

          Es sei denn, man benutzt den Begriff „regulärer Ausdruck“ fälschlicherweise auch für Suchmuster, die keine regulären Ausdrücke sind.

          aha, sowas gibt es? Ich kann Dir gerade nicht ganz folgen. Hättest Du mir da ein Beispiel für ein Suchmuster, das keinen regulären Ausdruck in dem von Dir verstandenen Sinne darstellt?

          Liebe Grüße,

          Felix Riesterer.

          -- ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
          1. @@Felix Riesterer:

            Hättest Du mir da ein Beispiel für ein Suchmuster, das keinen regulären Ausdruck in dem von Dir verstandenen Sinne darstellt?

            Suchmuster mit lookahead oder lookbehind. Sowas gibt´s in regulären Ausdrücken nicht.

            Live long and prosper,
            Gunnar

            -- Das einzige Mittel, den Irrtum zu vermeiden, ist die Unwissenheit. (Jean-Jacques Rousseau)
            1. @@Gunnar Bittersmann:

              Suchmuster mit lookahead oder lookbehind. Sowas gibt´s in [link:http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Theoretische_Grundlagen@title=regulären Ausdrücken] nicht.

              Ich hol dazu mal noch etwas weiter aus:

              Sei A ein regulärer Ausdruck. Laut der Definition regulärer Ausdrücke wäre A* auch ein regulärer Ausdruck. A? und A+ wären keine regulären Ausdrücke.

              Führen wir noch folgende Schreibweisen ein:

               (1)      A? = ε | A  (2)      A+ = A A*  (3)    A{0} = ε  (4)    A{n} = A A{n-1}       n∈ℕ; n≥1  (5)   A(n,} = A{n} A*        n∈ℕ  (6)   A{,n} = (A?){n}        n∈ℕ  (7)  A{m,n} = A{m} A{,n-m}   m,n∈ℕ; m≤n

              Sei a ein Zeichen des Alphabets, φ eine Auflistung von Zeichen (min. 1) des Alphabets, ψ die Auflistung aller nicht in φ enthaltener Zeichen des Alphabets, ω die Auflistung aller Zeichen des Alphabets. Dann führen wir noch folgende Schreibweisen ein:

               (8)      [] = ε  (9)     [a] = a (10)    [aφ] = a | [φ] (11)    [^φ] = [ψ] (12)       . = [ω]

              Die Einführung von [a-z] spar ich mir jetzt mal; dazu müsste man erstmal das Alphabet nicht als (ungeordnete) Menge definieren, sondern als geordnete Liste (coded character set).

              Alle diese Schreibweisen bringen aber nichts qualitativ Neues. Sie lassen sich in die laut Definition erlaubte Schreibweise überführen.

              Beispiel:

              [abc]{2,3} = [abc]{2} [abc]{,1}                                nach (7)            = [abc] [abc]{1} [abc]?{1}                          nach (4) und (6)            = [abc] [abc] [abc]{0} [abc]? [abc]?{0}             nach (4)            = [abc] [abc] [abc]?                                nach (3)            = [abc] [abc] (ε | [abc])                           nach (1)            = (a | [bc]) (a | [bc]) (ε | (a | [bc]))            nach (10)            = (a | b | [c]) (a | b | [c]) (ε | (a | b | [c]))   nach (10)            = (a | b | c) (a | b | c) (ε | (a | b | c))         nach (9)

              Nicht so aber bei look-around assertions: „Diese Konstrukte erweitern die regulären Ausdrücke um die Möglichkeit, kontextsensitive Bedingungen zu formulieren […]“ Kontextsensitiv, aber nicht regulär. (Chomsky-Hierarchie)

              Solche Suchmuster sind keine regulären Ausdrücke. Man sollte sie also IMHO nicht so bezeichnen. Die englische Wikipedia geht auf dieses Problem ein.

              „Aber wem erzähle ich das? Dem wissend zwinkernden? Wahrscheinlich doch nur dem Archiv.“ [at]

              Live long and prosper, Gunnar

              -- Das einzige Mittel, den Irrtum zu vermeiden, ist die Unwissenheit. (Jean-Jacques Rousseau)

              Folgende Nachrichten verweisen auf diesen Beitrag:

            2. Lieber Gunnar,

              Suchmuster mit lookahead oder lookbehind. Sowas gibt´s in regulären Ausdrücken nicht.

              und was sagt mir das für meine programmiererischen Tätigkeiten? Dass Cheatah Recht hat, weil diese Genauigkeit in der Fachterminologie ihm eben Recht gibt, oder dass ich Recht habe, da das Werkzeug dieser Suchmuster-Funktionen wie preg_replace() eine solche Ersetzung zuverlässig ermöglicht?

              Liebe Grüße,

              Felix Riesterer.

              -- ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
              1. Hi,

                da das Werkzeug dieser Suchmuster-Funktionen wie preg_replace() eine solche Ersetzung zuverlässig ermöglicht?

                Zuverlässig? Nur weil die Korrektheit noch nicht widerlegt ist ...

                cu,
                Andreas

                Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.

                -- Warum nennt sich Andreas hier MudGuard?
                O o ostern ...
      2. Hi,

        Eine RegExp reicht für Dein Vorhaben nicht aus.

        Das stimmt nicht.

        es stimmt nicht, dass das nicht stimmt.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes

  2. (.*) ist wahrscheinlich zu gierig und schnappt sich das vorhandene Alt-Tag.

    Gruß, LX

    -- X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
    1. @@LX:

      (.*) ist wahrscheinlich zu gierig und schnappt sich das vorhandene Alt-Tag.

      Ein Alt-Tag ist eine Kennzeichnung, die Automatix an das Fischregal von Verleihnix nagelt?

      Du hast die 5%-Hürde geschafft. ;-)

      Live long and prosper,
      Gunnar

      -- Das einzige Mittel, den Irrtum zu vermeiden, ist die Unwissenheit. (Jean-Jacques Rousseau)
    2. (.*) ist wahrscheinlich zu gierig...

      ich hatte verschiedene Variationen ausprobiert gehabt und da stand auch mal .*? wo jetzt nur .* steht - funktionierte natürlich auch nicht.

  3. Liebe(r) ich,

    $temp=preg_replace('/\<img(.*)(?!alt\=".*?")/i','<img alt=""$1',$temp);

    das ist ungenügend. Im Grunde bräuchtest Du lookahead oder lookbehind, um festzustellen, dass am Ende Deines Tags kein alt-Attribut enthalten ist/war, um es dann nachträglich zu ersetzen.

    Ich versuche etwas ins Blaue hinein (also ungetestet):

    $gefunden = preg_match_all('\~(?is)<img (?:(?!alt=").)+/?>\~', $html, $imgs); if ($gefunden) {     foreach ($imgs[1] as $img) {         $img_alt = str_replace('<img ', '<img alt="" ', $img);         $html = str_replace($img, $img_alt, $html);     } }

    Liebe Grüße,

    Felix Riesterer.

    -- ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi,

      $gefunden = preg_match_all('\~(?is)<img (?:(?!alt=").)+/?>\~', $html, $imgs);

      Gegenbeispiel:
      <img src="doppelpfeilnachrechts.png" title="==>" alt="==>">

      cu,
      Andreas

      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.

      -- Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      1. Lieber MudGuard,

        <img src="doppelpfeilnachrechts.png" title="==>" alt="==>">

        meines Wissens ist alt="==>" invalides Markup, da das > im Attributwert XML/HTML-codiert werden muss. Liege ich damit etwa falsch?

        Liebe Grüße,

        Felix Riesterer.

        -- ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Mae  govannen!

          <img src="doppelpfeilnachrechts.png" title="==>" alt="==>">

          meines Wissens ist alt="==>" invalides Markup, da das > im Attributwert XML/HTML-codiert werden muss. Liege ich damit etwa falsch?

          Vali, das Ohr meckert nicht, wenn ich das in ein entsprechendes Dokument stecke, weder bei HTML4.01 transitional noch XHTML transtitional odetr strict

          Cü,

          Kai

          selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
          Mein Selfhtml-Kram

          -- Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul

          Folgende Nachrichten verweisen auf diesen Beitrag:

        2. Hi,

          <img src="doppelpfeilnachrechts.png" title="==>" alt="==>">

          meines Wissens ist alt="==>" invalides Markup, da das > im Attributwert XML/HTML-codiert werden muss. Liege ich damit etwa falsch?

          Ja, da liegst Du falsch. < muß im Attributwert kodiert werden, > nicht.

          cu,
          Andreas

          Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.

          -- Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          1. Lieber MudGuard,

            Ja, da liegst Du falsch. < muß im Attributwert kodiert werden, > nicht.

            danke für die Klarstellung. In diesem Punkt habe ich anscheinend Wissensnachholbedarf. Sollte mich da mal (wieder?) genauer einlesen...

            Liebe Grüße,

            Felix Riesterer.

            -- ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. @@Felix Riesterer:

              Ja, da liegst Du falsch. < muß im Attributwert kodiert werden, > nicht.

              danke für die Klarstellung. In diesem Punkt habe ich anscheinend Wissensnachholbedarf. Sollte mich da mal (wieder?) genauer einlesen...

              Falls ja: [Regel 10] in der XML-Spec. (kein Bock auf SGML ;-))

              Live long and prosper,
              Gunnar

              -- Das einzige Mittel, den Irrtum zu vermeiden, ist die Unwissenheit. (Jean-Jacques Rousseau)
    2. Dabei gehen allerdings vorhandene ALT Tags verloren. Ziel soll sein bei fehlendem alt Attribut ein leeres dazu zu packen aber keine vorhandenen zu entfernen/ersetzen.

      1. Dabei gehen allerdings vorhandene ALT Tags verloren. Ziel soll sein bei fehlendem alt Attribut ein leeres dazu zu packen aber keine vorhandenen zu entfernen/ersetzen.

        Oder auch nicht - das lag an was anderem - altlasten :\

        nun ja - so funktioniert es für die Seiten die ich da durch jage - die geschichte mit dem "==>" kommt allerdings in keiner der Seiten vor

        $gefunden = preg_match_all('\~(?is)<img (?:(?!alt=".*?").)+/?>\~', $temp, $imgs); if ($gefunden) {     foreach ($imgs[0] as $img) {  $img_alt = preg_replace('/\<img /i', '<img alt="" ', $img);  $temp = str_replace($img, $img_alt, $temp);     } }
    3. Hi,

      das ist ungenügend. Im Grunde bräuchtest Du lookahead oder lookbehind, um festzustellen, dass am Ende Deines Tags kein alt-Attribut enthalten ist/war, um es dann nachträglich zu ersetzen.

      Ich versuche etwas ins Blaue hinein (also ungetestet):

      [code lang=php]$gefunden = preg_match_all('~(?is)<img (?:(?!alt=").)+/?>~', $html, $imgs);

      Es wäre unfair, nur zu sagen, geht nicht.
      Nach etwas Nachdenken bin ich jetzt zu diesem Monster gekommen:

      (?is:<img(?:\s+(?!alt)[a-z]+\s=\s(?:(?:"[^"]*") (?:'[^']*') (?:[-._:a-z0-9])))\s*/?>)

      Hier noch die etwas übersichtlichere Variante:

      (?isx:                      (?# we are searching case insensitive, across lines, and the regex allows whitespaces)
      <img                        (?# tag opener)
        (?:                       (?# attribe list start)
           \s+                    (?# there must be whitespace before the attribute name)
           (?!alt)                (?# name of attribute must not be alt - we are searching for img elements without alt attribute)
           [a-z]+                 (?# the attribute name - can't be anything but letters )
           \s                    (?# optional whitespace )
           =                      (?# the equal character (img does not have any empty attributes, so it must be there))
           \s
                          (?# optional whitespace )
           (?:                    (?# there are several possibilities for attribute values)
              (?:                 (?# 1st variant: in "")
                "
                [^"]             (?# 1st " is terminating the value)
                "
              )
              |                   (?# OR )
              (?:                 (?# 2nd variant: in '')
                 '
                 [^']
                  (?# 1st ' is terminating the value)
                 '
              )
              |                   (?# OR (3rd variant for HTML only, remove it for XHTML only))
              (?:
                 [-._:a-z0-9]    (?# 3rd variant: not enclosed, allows limited range of chars)
              )
           )                      (?# end of attribute value
        )
                              (?# attribute list end - attribute number is 0 or more)
        \s*                       (?# optional whitespace)
        /?                        (?# optional /, remove for HTML only, remove ? for XHTML only)
        >                         (?# tag closer)
      )

      Ich konnte bisher keinen validen Fall konstruieren, bei dem der Regex einen false positive oder false negative ergeben hätte.
      Was aber nicht heißt, daß es diesen Fall nicht gibt.
      Wer einen findet, möge ihn bitte nennen.

      cu,
      Andreas

      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.

      -- Warum nennt sich Andreas hier MudGuard?
      O o ostern ...