Freigeisterhaus Foren-Übersicht
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   NutzungsbedingungenNutzungsbedingungen   BenutzergruppenBenutzergruppen   LinksLinks   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

reguläre Ausdrücke...

 
Neues Thema eröffnen   Neue Antwort erstellen   Drucker freundliche Ansicht    Freigeisterhaus Foren-Übersicht -> DAU's Paradise
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Bynaus
Stellar veranlagt



Anmeldungsdatum: 03.11.2003
Beiträge: 1888
Wohnort: Hinwil, CH, Erde

Beitrag(#266103) Verfasst am: 22.02.2005, 14:48    Titel: reguläre Ausdrücke... Antworten mit Zitat

Hallo zusammen!

Kämpfe gerade mit Regulären Ausdrücken... Kennt sich da jemand aus?

In PHP hab ich folgenden Code:

$textausgabe1 = ereg_replace("\[img=([^\]]+)\](left)|(right)|(center)\[/img\]","<img align=\\2 src=images/\\1>",$texteingabe);

Der sollte eigentlich im String texteingabe nach Strings folgenden Musters suchen: [img=bild.gif]left[/img], und dann in einen HTML-Code <img align=left src=images/bild.gif> umwandeln...

Aber das funktioniert nicht. Weiss hier jemand, warum?
_________________
http://www.planeten.ch - Acht und mehr Planeten
http://www.final-frontier.ch - Kommentare vom Rand des Universums
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jan
registrierter User



Anmeldungsdatum: 29.10.2004
Beiträge: 440

Beitrag(#266113) Verfasst am: 22.02.2005, 15:08    Titel: Re: reguläre Ausdrücke... Antworten mit Zitat

Bynaus hat folgendes geschrieben:
$textausgabe1 = ereg_replace("\[img=([^\]]+)\](left)|(right)|(center)\[/img\]","<img align=\\2 src=images/\\1>",$texteingabe);

Das sucht nach "\[img=([^\]]+)\](left)" ODER "(right)" ODER "(center)\[/img\]".
Versuch's mal mit
Code:
$textausgabe1 = ereg_replace("\[img=([^\]]+)\](left|right|center)\[/img\]","<img align=\\2 src=images/\\1>",$texteingabe);

(Jedenfalls wäre es mit Perl so.)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bynaus
Stellar veranlagt



Anmeldungsdatum: 03.11.2003
Beiträge: 1888
Wohnort: Hinwil, CH, Erde

Beitrag(#266117) Verfasst am: 22.02.2005, 15:15    Titel: Antworten mit Zitat

Ja, danke, ich hab das korrigiert, aber es klappt irgendwie immer noch nicht...
_________________
http://www.planeten.ch - Acht und mehr Planeten
http://www.final-frontier.ch - Kommentare vom Rand des Universums
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
kolja
der Typ im Maschinenraum
Betreiber



Anmeldungsdatum: 02.12.2004
Beiträge: 16631
Wohnort: NRW

Beitrag(#266124) Verfasst am: 22.02.2005, 15:29    Titel: Re: reguläre Ausdrücke... Antworten mit Zitat

Hi Bynaus!

Die Funktion ereg_replace() verwendet die sogenannten POSIX Regular Expressions, die werden in den regex man pages beschrieben.

Folgender Code funtkioniert wie von dir erwartet:

Code:
$textausgabe1 = ereg_replace("\\[img=([^]]+)\\](left|right|center)\\[/img\\]","<img align=\\2 src=images/\\1>", $texteingabe);


Die Fehler in deinem Code im einzelnen ...

Code:
ereg_replace("\[img=


Der Backslash "\" wird in PHP verwendet, um bestimmte Sonderzeichen in Zeichenketten einzubetten, z.B. CARRIAGE RETURN = "\r", LINE FEED = "\n" und TAB = "\t". Wenn deine Zeichenkette ein literal Backslash enthalten soll, musst du "\\" verwenden.

Das hat nichts mit der Bedeutung des Backslashs in regulären Ausdrücken (hier: das spezielle zeichen "[" wie ein gewöhnliches Zeichen behandeln) zu tun, es handelt sich um eine Konvention, die in PHP für alle Zeichenketten gilt.

Code:
[^\]]+

regex man page hat folgendes geschrieben:
To include a literal `]' in the list, make it the first character (following a possible `^').


Innerhalb einer bracket expression gelten andere Regeln um spezielle Zeichen einzugeben, daher ist der Backslash überflüssig.

Code:
(left)|(right)|(center)


Das lässt sich nicht mehr mit "\\2" referenzieren, weil du drei atoms erzeugt hast.

Grüße,
Kolja.
_________________
Hard work often pays off after time, but laziness always pays off now.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Bynaus
Stellar veranlagt



Anmeldungsdatum: 03.11.2003
Beiträge: 1888
Wohnort: Hinwil, CH, Erde

Beitrag(#266130) Verfasst am: 22.02.2005, 16:14    Titel: Antworten mit Zitat

Super! Jetzt funktionierts!
Seltsam aber, dass ein ähnlicher Code, der innerhalb des anführenden Tags bloss eine Zahl enthält und ein einfacher beliebiger Text (und keine Auswahl) zwischen den Tags enthält, es auch ohne den litteralen Backslash funktioniert hat... aber danke vielmals.

Du hast noch geschrieben, dass sich der align nicht mehr mit \\2 referenzieren liesse - warum funktionierts denn trotzdem?
_________________
http://www.planeten.ch - Acht und mehr Planeten
http://www.final-frontier.ch - Kommentare vom Rand des Universums
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
kolja
der Typ im Maschinenraum
Betreiber



Anmeldungsdatum: 02.12.2004
Beiträge: 16631
Wohnort: NRW

Beitrag(#266139) Verfasst am: 22.02.2005, 16:56    Titel: Antworten mit Zitat

Bynaus hat folgendes geschrieben:
Super! Jetzt funktionierts!


Fein Smilie

Zitat:
Seltsam aber, dass ein ähnlicher Code, der innerhalb des anführenden Tags bloss eine Zahl enthält und ein einfacher beliebiger Text (und keine Auswahl) zwischen den Tags enthält, es auch ohne den litteralen Backslash funktioniert hat...


Möglicherweise ist PHP tolerant und ignoriert Sequenzen in der Form "\x", wenn für "x" keine Ersetzung definiert ist. Das würde dazu führen, das "\\[" und "\[" zur Zeit gleichwertig sind.

Ich hab halt alle Fehler korrigiert, die mir aufgefallen sind, ohne zu prüfen, ob sie ursächlich waren. freakteach

Zitat:
Du hast noch geschrieben, dass sich der align nicht mehr mit \\2 referenzieren liesse - warum funktionierts denn trotzdem?


Code:
... (left)|(right)|(center) ... align=\\2


Auch wenn du hier drei sich gegenseitig ausschließende Alternativen formulierst, so hast du doch drei Atome (Atom = Teilausdruck in runden Klammern) erzeugt, die jeweils eine eigene laufende Nummer bekommen. Dein replacement referenziert nur das erste Atom, was du aber nicht merken wirst, wenn du immer mit "left" als Eingabe testest.

Darum habe ich deine Alternativen in einem Atom zusammengefasst:

Code:
... (left|right|center) ... align=\\2


Allerdings hätte auch das hier funktioniert:

Code:
... (left)|(right)|(center) ... align=\\2\\3\\4


Grüße,
Kolja.
_________________
Hard work often pays off after time, but laziness always pays off now.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Bynaus
Stellar veranlagt



Anmeldungsdatum: 03.11.2003
Beiträge: 1888
Wohnort: Hinwil, CH, Erde

Beitrag(#298837) Verfasst am: 30.05.2005, 17:44    Titel: Antworten mit Zitat

Ich hab wieder mal eine regexp-Frage... zwinkern

Ich versuche, ein Skript zu schreiben, das aus einem Tag [content=Irgendwas Irgendetwas] einen Link <a href=?content=Irgendwas>Irgendetwas</a> macht. Mit [content=Irgendwas] zu <a href=?content=Irgendwas>Irgendwas</a> funktionierts bereits, aber den Alternativtext scheint es nicht zu schlucken. Was mache ich falsch?

Code:

while(ereg("\\[content=([A-Za-z0-9]+)([\s][A-Za-z0-9]*)?\\]",$text,$regs))
   {
      if($regs[2] == NULL)
      {
         $text = str_replace("[content=$regs[1]]","<a href=?content=$regs[1]>$regs[1]</a></strong>",$text);
      }
      else
      {
         $text = str_replace("[content=$regs[1] $regs[2]]","<a href=?content=$regs[1]>$regs[2]</a></strong>",$text);
      }
   }

_________________
http://www.planeten.ch - Acht und mehr Planeten
http://www.final-frontier.ch - Kommentare vom Rand des Universums
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Rasmus
entartet und notorisch gottlos - Ich bin Papst



Anmeldungsdatum: 20.05.2004
Beiträge: 17559

Beitrag(#298845) Verfasst am: 30.05.2005, 17:56    Titel: Antworten mit Zitat

http://www.spotlight.de/zforen/web/m/web-1117202291-671.html

Für den Fall, daß Du das Rad nicht unbedingt neu erfinden möchtest.

Rasmus.
_________________
Brother Sword of Enlightenment of the Unitarian Jihad
If you ask the wrong questions you get answers like '42' or 'God'.
"Glaubst Du noch oder hüpfst Du schon?"
Sylvia Browne - Wahrsager oder Scharlatan?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bynaus
Stellar veranlagt



Anmeldungsdatum: 03.11.2003
Beiträge: 1888
Wohnort: Hinwil, CH, Erde

Beitrag(#299020) Verfasst am: 31.05.2005, 07:59    Titel: Antworten mit Zitat

Danke für den Link... Wäre gut zu wissen gewesen, dass es sowas gibt...

Tatsächlich aber bin ich fast durch mit der Neuerfindung des Rads... zwinkern Deshalb wäre ich froh um einen kurzen Tipp zur RE. Warum erkennt "/[A-Za-z0-9]+)([\s][A-Za-z0-9]*)?/" eventuell nachgestellte Text-Ausdrücke nicht?
_________________
http://www.planeten.ch - Acht und mehr Planeten
http://www.final-frontier.ch - Kommentare vom Rand des Universums
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Bynaus
Stellar veranlagt



Anmeldungsdatum: 03.11.2003
Beiträge: 1888
Wohnort: Hinwil, CH, Erde

Beitrag(#299048) Verfasst am: 31.05.2005, 11:46    Titel: Antworten mit Zitat

Ich hab den Code mittlerweile so abgeändert:

Code:
$text = ereg_replace("\\[content=([^]]+) ([^]]*)\\]","<a href=?content=\\1]>\\2</a>",$text);

   $text = ereg_replace("\\[content=([^]]+)\\]","<a href=?content=\\1]>\\1</a>",$text);


Nur: Die Links werden jetzt so ausgegeben: <a href=?content=Irgendwas]>Irgendetwas</a>". Also am Ende des Links immer noch eine schliessende eckige Klammer zuviel. Was mache ich falsch?

EDIT: Ähm, ja, tja, Tippfehler... so...

Code:
"<a href=?content=\\1>\\1</a>"


statt so...

Code:
"<a href=?content=\\1]>\\1</a>"

_________________
http://www.planeten.ch - Acht und mehr Planeten
http://www.final-frontier.ch - Kommentare vom Rand des Universums
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen   Drucker freundliche Ansicht    Freigeisterhaus Foren-Übersicht -> DAU's Paradise Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.



Impressum & Datenschutz


Powered by phpBB © 2001, 2005 phpBB Group