Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Bynaus Stellar veranlagt
Anmeldungsdatum: 03.11.2003 Beiträge: 1888
Wohnort: Hinwil, CH, Erde
|
(#266103) Verfasst am: 22.02.2005, 14:48 Titel: reguläre Ausdrücke... |
|
|
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 |
|
|
Jan registrierter User
Anmeldungsdatum: 29.10.2004 Beiträge: 440
|
(#266113) Verfasst am: 22.02.2005, 15:08 Titel: Re: reguläre Ausdrücke... |
|
|
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 |
|
|
Bynaus Stellar veranlagt
Anmeldungsdatum: 03.11.2003 Beiträge: 1888
Wohnort: Hinwil, CH, Erde
|
(#266117) Verfasst am: 22.02.2005, 15:15 Titel: |
|
|
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 |
|
|
kolja der Typ im Maschinenraum
Anmeldungsdatum: 02.12.2004 Beiträge: 16631
Wohnort: NRW
|
(#266124) Verfasst am: 22.02.2005, 15:29 Titel: Re: reguläre Ausdrücke... |
|
|
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.
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 |
|
|
Bynaus Stellar veranlagt
Anmeldungsdatum: 03.11.2003 Beiträge: 1888
Wohnort: Hinwil, CH, Erde
|
(#266130) Verfasst am: 22.02.2005, 16:14 Titel: |
|
|
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 |
|
|
kolja der Typ im Maschinenraum
Anmeldungsdatum: 02.12.2004 Beiträge: 16631
Wohnort: NRW
|
(#266139) Verfasst am: 22.02.2005, 16:56 Titel: |
|
|
Bynaus hat folgendes geschrieben: | Super! Jetzt funktionierts! |
Fein
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.
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 |
|
|
Bynaus Stellar veranlagt
Anmeldungsdatum: 03.11.2003 Beiträge: 1888
Wohnort: Hinwil, CH, Erde
|
(#298837) Verfasst am: 30.05.2005, 17:44 Titel: |
|
|
Ich hab wieder mal eine regexp-Frage...
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 |
|
|
Rasmus entartet und notorisch gottlos - Ich bin Papst
Anmeldungsdatum: 20.05.2004 Beiträge: 17559
|
|
Nach oben |
|
|
Bynaus Stellar veranlagt
Anmeldungsdatum: 03.11.2003 Beiträge: 1888
Wohnort: Hinwil, CH, Erde
|
(#299020) Verfasst am: 31.05.2005, 07:59 Titel: |
|
|
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... 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 |
|
|
Bynaus Stellar veranlagt
Anmeldungsdatum: 03.11.2003 Beiträge: 1888
Wohnort: Hinwil, CH, Erde
|
(#299048) Verfasst am: 31.05.2005, 11:46 Titel: |
|
|
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 |
|
|
|