PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RegEx Subexpression



micha
17-09-2003, 17:07
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:


$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:



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

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


Theorie:



Font:Helvetica
Text: Hello World


Praxis:



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

sixfriends
04-10-2003, 16:52
Bin mir nicht ganz sicher, ob das dein Problem ist, aber wie wär es damit:



$line = "[FONT=Courier] Hello World !"
$help_array = explode(' ', $line);
$font = $help_array[0];
$text = substr($line, strlen($font)+1);


Dann ist $font = "[FONT=Courier]" und $text = "Hello World !"

sixfriends
05-10-2003, 02:29
Vielleicht noch besser gleich:


$line = "[FONT=Courier] Hello World !"
$help_array = explode(' ', $line);
$text = substr($line, strlen($help_array[0])+1);
$font = substr($help_array[0], 6, -1);


Hab ich mir grad so überlegt, dann steht in $font gleich der Schriftname

mehlvogel
05-10-2003, 07:56
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 :-/

sixfriends
05-10-2003, 14:18
@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:


$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/pcre.pattern.syntax.php

(Damit auch mehlvogel zufrieden ist :D)

mehlvogel
05-10-2003, 15:05
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 :D

RapidMax
05-10-2003, 15:49
Stimmt, Reguläre Ausdrücke können sehr effizient als Automaten implementiert werden.

Gruss, Andy

sixfriends
05-10-2003, 16:55
@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! :p

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.

RapidMax
05-10-2003, 17:19
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! :p
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

sixfriends
05-10-2003, 19:14
IMNSHO: Java siedelt sich von der Geschwindigkeit an irgendwo zwischen Perl und Pascal aber mit sehr viel mehr Nähe zu Perl :p

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!! http://www.linuxforen.de/ubb/ugly.gif

sixfriends