Anzeige:
Ergebnis 1 bis 10 von 10

Thema: RegEx Subexpression

  1. #1
    Registrierter Benutzer
    Registriert seit
    25.12.1999
    Ort
    Stuttgart
    Beiträge
    259

    RegEx Subexpression

    Hi,

    ich hab hier ein Problem, dass mich langsam zum Wahnsinn treibt.
    Ich benötige Teile aus einem String, der einen UBB-ähnlichen Tag und dahinter Text enthält.
    Beispiel-String:

    PHP-Code:
    $line "[FONT=Courier] Hello World !" 
    Zum Einen benötige ich den Schriftnamen, zum Anderen den Text hinter dem Tag, also hier "Courier" und " Hello World !". Das Ganze sollte mit einem einzigen Pattern möglich sein.
    Ich hab schon zig Patterns getestet, die in Visual RegExp funktionieren, aber nicht in PHP.
    Einer der Versuche sieht so aus:

    PHP-Code:
    $line "[FONT=Helvetica] Hello World";
    $pattern '/\[FONT=([^\\[\\]]*)\\](.*?)/';

    echo 
    "Font: ".preg_replace ($pattern'\\\\1'$line);
    echo 
    "<br>";
    echo 
    "Text: ".preg_replace ($pattern'\\\\2'$line); 
    Theorie:

    Code:
    Font:Helvetica
    Text: Hello World
    Praxis:

    Code:
    Font: Helvetica Hello World
    Text: Hello World
    Mein Problem ist, dass ich nicht an den Schriftnamen komme, ohne den Text hinter dem Tag, der jedes Mal mitangehängt wird. ???

    Gruß micha

    P.S.: php version 4.3.1
    IRC: irc.euirc.net #tux

  2. #2
    Registrierter Benutzer Avatar von sixfriends
    Registriert seit
    26.03.2003
    Ort
    /home/sixfriends
    Beiträge
    285
    Bin mir nicht ganz sicher, ob das dein Problem ist, aber wie wär es damit:

    PHP-Code:
    $line "[FONT=Courier] Hello World !"
    $help_array explode(' '$line);
    $font $help_array[0];
    $text substr($linestrlen($font)+1); 
    Dann ist $font = "[FONT=Courier]" und $text = "Hello World !"
    .
    Wenn die Sonne der Kultur niedrig steht, werfen selbst Zwerge einen Schatten.

  3. #3
    Registrierter Benutzer Avatar von sixfriends
    Registriert seit
    26.03.2003
    Ort
    /home/sixfriends
    Beiträge
    285
    Vielleicht noch besser gleich:
    PHP-Code:
    $line "[FONT=Courier] Hello World !"
    $help_array explode(' '$line);
    $text substr($linestrlen($help_array[0])+1);
    $font substr($help_array[0], 6, -1); 
    Hab ich mir grad so überlegt, dann steht in $font gleich der Schriftname
    .
    Wenn die Sonne der Kultur niedrig steht, werfen selbst Zwerge einen Schatten.

  4. #4
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615
    und was ist wenn zwischen [font... und Hello World kein Leerzeichen ist? Dann ist sich das essig

    Da du, wenn du den Tag öffnest, den auch wieder schließne möchtest (ich nehme das mal an) dann probier das hier mal:

    /\[font=(['\"]?)([^\"']*)\\1](.*)\[\/font\]/siU
    Wod er genaue Fehler ist, weis ich allerdings nicht, da ich RegEx nicht beherrsche :-/
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

  5. #5
    Registrierter Benutzer Avatar von sixfriends
    Registriert seit
    26.03.2003
    Ort
    /home/sixfriends
    Beiträge
    285
    @mehlvogel: Wenn aber bei "[FONT=Courier] Hello World !" als Text "Hello World !" rauskommt oder rauskommen soll, geh ich einfach mal davon aus, dass der Ausdruck syntaktisch so aussehen muss. Ansonsten kann man ja auch bei "]" exploden lassen

    Mal sehen, ob ich vielleicht das mit dem regulären Ausdruck hinbekomme:
    PHP-Code:
    $line "[FONT=Helvetica] Hello World";
    $pattern '/\[FONT=(.*)\](.*)/';
    echo 
    "Font: ".preg_replace ($pattern'\\1'$line);
    echo 
    "<br>";
    echo 
    "Text: ".preg_replace ($pattern'\\2'$line); 
    Bei mir hat es so geklappt.
    Quelle: http://www.dynamic-webpages.de/php/p...ern.syntax.php

    (Damit auch mehlvogel zufrieden ist )
    .
    Wenn die Sonne der Kultur niedrig steht, werfen selbst Zwerge einen Schatten.

  6. #6
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615
    Die Methode mit dem Exploden hat aber den Nachteil das sie länger brauch - das ist einmal preg_replace (wo man sofort alles rauskriegt) gegenüber einer Kombination aus explode, 2x substr, strlen, dazu ein Hilfsarray + eine zusätzlihe Variable. Jetzt stell dir mal nen 100k Zeichen TExt vor mit 20 - 50 Formatierungen - dann fängt das an eine Rolle zu spielen

    So, damit wir alle zufrieden sind
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

  7. #7
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Stimmt, Reguläre Ausdrücke können sehr effizient als Automaten implementiert werden.

    Gruss, Andy

  8. #8
    Registrierter Benutzer Avatar von sixfriends
    Registriert seit
    26.03.2003
    Ort
    /home/sixfriends
    Beiträge
    285
    @Rapidmax, nur so aus Interesse:
    Informatikstudent, letztes Semester Automatentheorie/formale Sprachen?

    @mehlvogel:
    Ich geb mich ja schon geschlagen. Bevor ich mit PHP angefangen hab, hab ich ein halbes Jahr nur Java programmiert, da ist sowieso nicht viel mit Geschwindigkeit oder Effizienz!

    btw: Wenn man bei dem regulären Ausdruck den ich aufgestellt habe noch FONT durch (.*) ersetzt, kann man das ganze erweitern und auch noch anfere Tags zulassen, denn ob es FONT ist, das steht dann in \\1.
    .
    Wenn die Sonne der Kultur niedrig steht, werfen selbst Zwerge einen Schatten.

  9. #9
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Original geschrieben von sixfriends
    @Rapidmax, nur so aus Interesse:
    Informatikstudent, letztes Semester Automatentheorie/formale Sprachen?
    *autsch*, voll erwischt
    Allerdings will ich hier ergänzen, dass ich das nicht nur nachplappere, sondern für ein eigenes C-Progrämmchen das umgesetzt habe.

    @mehlvogel:
    Ich geb mich ja schon geschlagen. Bevor ich mit PHP angefangen hab, hab ich ein halbes Jahr nur Java programmiert, da ist sowieso nicht viel mit Geschwindigkeit oder Effizienz!
    Hält sich in Grenzen: Sofern keine Grafikausgaben mit Swing im Spiel sind, und sauber programmiert wurde, kann Java ordentlich schnell sein. Ich habe z.B. gestaunt, wie schnell sich das Apfelmännchen (Mandelbrot-Menge) ausrechnen lässt. (JIT-Compiler sei dank?)

    Btw.: IMHO lohnt es sich nicht immer auf Geschwindigkeit zu optimieren, wenn die Übersichtlichkeit des Codes daran leidet. Nur in sogenannten Hot-Spots, d.h. viel ausgeführten Code-Fragmenten (z.B. in Loops) sollte man auch in Zeiten von 2GHz-Kisten optimieren.

    Gruss, Andy

  10. #10
    Registrierter Benutzer Avatar von sixfriends
    Registriert seit
    26.03.2003
    Ort
    /home/sixfriends
    Beiträge
    285
    IMNSHO: Java siedelt sich von der Geschwindigkeit an irgendwo zwischen Perl und Pascal aber mit sehr viel mehr Nähe zu Perl

    Bei uns gibt es einen Datenbank Server http://dblp.uni-trier.de/, der ist in Java geschrieben und hat als Datenbank eine zur Zeit 178MB große XML Datei (warum auch immer). Das Softwarepraktikum, das darin bestand, diesem Sch...abernack Statistiken hinzuzufügen, hab ich aufgegeben. Denn die Programmierung, die aus glaub ich 20 Dateien á 20 Zeilen Quellcode bestand (naja, vielleicht auch etwas mehr), bis das alles kompliliert war, konnte ich mir ne Pizza in den Ofen schieben und (fast) noch in Ruhe essen!!

    sixfriends
    .
    Wenn die Sonne der Kultur niedrig steht, werfen selbst Zwerge einen Schatten.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •