• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

bedingter Ersetzungs-regex (php)

OsunSeyi

Hacker
Hi,
habe schon *hier* gefragt :eek:ps: .
Ich hoffe das ist ok, habe hier immer gut Antwort bekommen..
Ich suche einen regex, das Problem ist im Grunde ganz einfach.
Es geht um einen einfachen Html-Editor.
Es sollen alle Leerzeichen von Anfang der Zeile bis zum (eingerückten) Text durch ' ' ersetzt werden.
Aber nur, wenn Text folgt und nicht ein html-Tag.
Das ganze mit php:
Code:
preg_replace('/^ +([^<].*)$/m', ' \1', $text);
...sollte doch in die Richtung gehen.
Ersetzt aber alle Leerzeichen durch ein ' ', nicht wie gewünscht jedes Leerzeichen...
Wie kann ich das lösen?
tom
 
A

Anonymous

Gast
Dazu müsstest du erstmal präzisieren was
Daß heisst, bei allen Zeilen, die mit Leerzeichen beginnen und nach den Leerzeichen kein '<' folgen lassen, sollen alle Leerzeichen ersetzt werden
jetzt genau werden soll, regex ist so streng logisch, das man die Aufgabe auch logisch genau stellen muss, sonst wird es nichts.

Sollen in Abhängigkeit von einem Leerzeichen am Zeilenanfang und dem Vorkommen von "<" irgendwo innerhalb der Zeile hinter einem Leerzeichen, nun alle möglichen Leerzeichen (nur am Anfang der Zeile), oder auch alle anderen Leerzeichen auf der ganzen Zeile ersetzt werden? Alle bisherigen regulären Ausdrücke die du hier gezeigt hast, wiedersprechen irgendwie deiner Fragestellung.

Am besten setzt du mal 2-3 Beispiele (vorher/nachher) hier her, wie das aussehen soll.

Aber selbst wenn wir das jetzt nach IEEE POSIX Standard eindeutig lösen, und das mit 10 Scripten- und Programmiersprachen auch nachweisen können, das es funktioniert, könnte man immer noch noch nicht sicher sein, das das PHP auch wirklich genauso macht. Die Implementierung der einzelnen regex "Dialekte" in den verschiedenen Spachen ist doch ziemlich unterschiedlich und lässt sich in vielen Programmiersprachen auch noch steuern, welchen regex Standard er jetzt aktuell benutzen soll.

Ich glaube wenn es wirklich mit PHP gemacht werden soll, dann ist das hier nicht richtig aufgehoben, für PHP haben wir hier nicht die richtigen Spezialisten und Klientel.

robi
 
OP
OsunSeyi

OsunSeyi

Hacker
Also,
Es geht um einen einfachen html-Editor, der div. Ersetzungen für vordefiniert Links und graphische Elemente erlaubt.
Diese Site arbeitet mit diesem Editor (der rechte Frame => Quelltext)
Vorlage für den Html-Output ist jeweils eine Ascii-Textdatei, die Html-Tags zwar zulässt, aber weitestgehend überflüssig macht.
In der Vorlage eingerückter Text wird auch in Html eingerückt:
Code:
     Texttexttext
     Texttexttext
     Texttexttext
..wird zu:
     Texttexttext
     Texttexttext
     Texttexttext
Um aber auch der Ascii-Vorlage eine gewisse Formatierung geben zu können, sollen Leerzeichen nur dann ersetzt werden,
wenn 'normaler' Text [A-Za-zÄÖÜäöüß] folgt.
Es müssen also Ausnamen ermöglicht werden:
Code:
                                   <b>
     Texttexttext
     Texttexttext
..wird zu:
                                   <b>
     Texttexttext
     Texttexttext
Es sollen (pauschalisiert) bei alle Vorkommen von \s in:
Code:
|^\s+[A-Za-zÄÖÜäöüß].*$|
..ersetzt werden,
Und unter Berücksichtigung der Ausname Html-Tags (pauschalisiert):
|^\s+[^<].*$|
Daß heisst, bei allen Zeilen, die mit Leerzeichen beginnen und nach den Leerzeichen kein '<' folgen lassen, sollen alle Leerzeichen ersetzt werden.
Aber wie setzt man das um?
Denn die Formulierung (frei Schnauze):
Code:
s|^\s+([^<].*)$| \1|g
...sagt: Wenn eine Zeile mit einem oder mehreren Leerzeichen beginnt, und dahinter alles mögliche ausser '<' folgt, ersetze die Leerzeichen zwischen Zeilenanfang und [^<] durch *ein* '&nbsp', den nachfolgenden Text aber lass in Ruhe.
Ich will aber *jedes* Leerzeichen durch jeweils ein '&nbsp' ersetzen, in dem Sinn:
Wenn die Bedingung erfüllt ist, daß kein '<' folgt, ersetze jedes einzellne '\s' zwischen Zeilenanfang und nachfolgendem Text durch ein '&nbsp'.
Es handelt sich also um einen 'bedingten Regex': siehe hier
Bin aber nicht firm genug, das umzusetzen. Daher die Frage!
Meine Lösung sieht zur Zeit so aus, daß ich mit einer if-Abfrage das Problem umschiffe, trotzdem bleibt aber die Frage nach dem Regex.
Da php die Perl-Syntax meines wissens mehr oder weniger komplett implementiert hat (obwohl es in Perl vermutlich einfacher ist), glaube ich auch, daß besagter 'bedingter regex' funktionieren müsste - nur wie?
tom
 
A

Anonymous

Gast
auf der Konsole sähe sowas mit sed zB so hier aus.
Code:
sed '/.*</!s| |\&nbsp|g'
mit awk könnte man das so hier auch machen
Code:
awk '$0 !~ "<"{gsub(" ","\\&nbsp");print $0};$0 ~"<"'
mit dem vi geht das auch im Batchmodus
Perl war schon im anderen Beitrag was dabei
phyton könnten wir dir bestimmt auch noch anbieten
und wenn ich mal viel Zeit habe kann ich das auch noch in Brainfuck lösen ;)
aber mit PHP scheint sich hier außer dir wohl keiner zu beschäftigen, zumal du hier wohl auf spezielle Erweiterungen von regex hinaus willst.

robi
 
Oben