Antipitch: Geschwindigkeit/ Speicherauslastung String Operation

Moinsen,

kurze Frage an die PHP Experten bezüglich folgendem String (die Reihenfolge der Attribute ist garantiert immer gleich):

<img src="foo" alt="bar" width="foo" height="foo" />

Was ist eurer Meinung nach die schnellste bzw. am wenigsten speicherintensive Methode, um nur den Wert des alt Atrributs (also: bar) zurück zu erhalten?

Danke schön!
Antipitch

  1. Hallo,
    da du PHP nutzt:
    Per strpos() die Position von 'alt="' ermitteln und dann bis zum Ende des Alt-Attributes auslesen.

    Grüße
    Klaus

  2. <img src="foo" alt="bar" width="foo" height="foo" />

    Was ist eurer Meinung nach die schnellste bzw. am wenigsten speicherintensive Methode, um nur den Wert des alt Atrributs (also: bar) zurück zu erhalten?

    Kommt darauf an, wie flexibel die Erkennung sein soll und wie der gesamte String aussieht.
    Wenn es sich bloß um obigen String handelt, suchst du nach der Position von alt=", dann die des folgenden " und nimmst den Teil-String dazwischen.
    Wenn das img-Element irgendwo in einem größeren String mit mehr HTML-Code liegt, müsste ein Parser es erst einmal finden. Da kannst du dir natürlich einen speziellen schreiben, der sehr schnell wäre, aber reichen Reguläre Ausdrücke nicht aus? Eine andere Möglichkeit wäre DOM, aber das ist wirklich nicht auf Geschwindigkeit und Speicherverbrauch optimiert.
    Suchst du eine akzeptable Lösung oder tatsächlich die schnellste? (Warum?) Dann rück mal genauere Anforderungen heraus.

    Mathias

    1. Dank euch schon mal für eure Antworten (mehrere -wenn's geht mit wirklichem PHP Wissen, ich will ja auch was lernen dabei- sind durchaus erwünscht)!

      @Mathias

      Der String sieht immer genau aus wie beschrieben und es ist ein vollständiger eigener String (kein Teilstück). Und er kommt direkt aus'ner Datenbank als Teil eines serialisierten Arrays in die PHP Anwendung, also kein HTML oder DOM involved.

      Es geht mir nur und wirklich um die Geschwindgkeit dieser einen Operation, sie soll den gesamten Prozess, in dem sie stattfindet möglichst wenig aufhalten. Dass es  mehrere Möglichkeiten dafür gibt ist mir natürlich bekannt, ich such halt nur die schnellste...

      cheers
      Antipitch

      1. Hello,

        Es geht mir nur und wirklich um die Geschwindgkeit dieser einen Operation, sie soll den gesamten Prozess, in dem sie stattfindet möglichst wenig aufhalten. Dass es  mehrere Möglichkeiten dafür gibt ist mir natürlich bekannt, ich such halt nur die schnellste...

        Und wie wäre es, gleich die Stringfunktionen der Datenbank zu benutzen?

        Liebe Grüße aus Ratzeburg

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hi Tom,

          Und wie wäre es, gleich die Stringfunktionen der Datenbank zu benutzen?

          hm, das geht glaub ich in diesem Fall (serialisiertes Array) nicht. Oder vielleicht doch?

          Beispiel DB Eintrag (sieht immer gleich aus, nur die Inhalte von 'unit' und 'value' schwanken natürlich):

            
          a:2:{s:4:"unit";s:2:"h2";s:5:"value";s:97:"<img src="verzeichnis/foo.png" alt="bar" width="foo" height="foo" />";}  
          
          

          Das Original-Array muss für übergeordnete Prozesse so erhalten bleiben. Meine angesprochene Operation findet in einer callback Funktion mit eigener DB Abfrage statt, die den Inhalt des alt-Attributes für eine (gleichzeitige) andere Sache braucht...

          cheers
          Antipitch

          1. Guten Tag,
            eine wirkliche Antwort auf die Ausgangsfrage dieses Threads habe ich nicht gefunden, obwohl mir das Tempo bei sehr häufiger bzw. paralleler Ausfürung auch für solche einfachen Operationen nicht unwichtig erscheint.

            Falls sich jemand mal eine ähnliche Frage stellt: bin bei meiner sowieso geplanten Lösung per preg_match und regexp Lookbehind/ Lookahead geblieben. Ist wenigstens kurz:

              
            preg_match('/(?<=alt=").*?(?=")/', $strWieObenBeschrieben, $arrResult);  
            $strHereWeGo = $arrResult[0];  
            
            

            danke
            Antipitch