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

[gelöst] php: bedingte Ersetzung regex

OsunSeyi

Hacker
Hi, (und frohe Ostern..)
Suche eine Möglichkeit, mit php bedingt zu ersetzen, es gibt doch eine wenn-dann Konstruktion für Regexe: (?if then|else)
Es soll bei alle Vorkommen von:
Code:
/^\s+[^<].*$/
die Leerzeichen durch ' ' ersetzt werden.
Daß heisst, bei allen Zeilen, die mit Leerzeichen beginnen und nach den Leerzeichen kein '<' folgen lassen, sollen alle Leerzeichen ersetzt werden.
Bei der Formulierung:
Code:
preg_replace('/^ +([^<].*)$/m', ' \1', $text);
würden alle Leerzeichen durch *ein* '&nbsp' ersetzt werden.
Ich will aber -in Abhängigkeit davon, daß kein '<' folgt- , jedes einzelne Leerzeichen ersetzen.
tom
PS
Ok, ich hoffe es ist ok, wenn ich nochmal im 'Konsole'- Forum frage...
 

}-Tux-{

Hacker
Du koenntest folgendes probieren ("Pseudocode"):
Code:
s/^(\s+)([^<].*)$/"foo" * length($1) $2/
Das laesst sich bestimmt auch in PHP umsetzen.


}-Tux-{
 
OP
OsunSeyi

OsunSeyi

Hacker
Im Prinzip sollte das wohl gehen, ich schaffe es aber nicht.
Code:
$text=preg_replace('|^( +)([^<].*)$|m', strlen('\1'), $text);
spuckt '2' aus, aber nicht die Anzahl der gefundenen Leerzeichen.
Hab mit div. Kombinationen von einfachen und doppelten Anführungszeichen probiert, nützt aber nichts.
Vielleicht finde ich einen Weg, die Ersetzungen von vorneherein zeilenweise "file()" vorzunehmen, dann kann eine if-Abfrage die Lösung bringen.
Wie kann eine so einfache Aufgabe so schwer sein - das müsste doch über den regex zu lösen sein...
tom
 
OP
OsunSeyi

OsunSeyi

Hacker
Ok,
mit file() geht es natürlich (das Ergebnis: http://www.okonfo-rao-kawawa.de), aber es ist trotzdem ein bisschen schade, das Prob nicht über einen regex gelöst zu haben. Kann mir nicht vorsteĺlen, daß das nicht gehen soll.. :???:
Soll man den Fall nun als "gelöst" betrachten ?
 

abgdf

Guru
Warum willst Du alles in eine RegEx packen? Ich find's besser, wenn man soweit wie möglich in der Sprache bleibt, anstatt so'n kryptisches RegEx-Zeug von sich zu geben. Mit PHP hab ich aber nichts am Hut:
Code:
#!/usr/bin/perl

use warnings;
use strict;

my $t1 = "Ein Text ohne Leerzeichen am Anfang.\n";
my $t2 = "    <p>Hallo, ich bin Rex.\n";
my $t3 = "    Hallo, das ist ein Text.\n";

print &changeSpaces($t1);
print &changeSpaces($t2);
print &changeSpaces($t3);

sub changeSpaces {

    my $t = shift;

    if ($t =~ m/^[^ ]/  || # Kein Leerzeichen am Anfang
        $t =~ m/^ +</      # Ein oder mehrere Leerzeichen, aber dann <
       ) {
        return $t;
    }

    my $b = "";

    while ($t =~ m/^ /) {
        $t =~ s/^ //;
        $b .= " ";
    }
    return "$b$t";
}
Gruß
 
OP
OsunSeyi

OsunSeyi

Hacker
Hallo abgdf

Vielen Dank für den Perl-Code (ab und an versuche ich ein bisschen zu lernen), er wird bei mir hinterlegt...
In php habe ich das Problem mit einem Zeilenweisen Auslesen der Datei 'file(datei)' gelöst, dadurch ist genau diese Vorgehensweise möglich.
Dh mit einer if-Abfrage...
Wenn die Zeile soundso gebaut ist, ersetze. Dann kann ich, wie oben von }tux{ vorgeschlagen, über eine php-Funktion die Anzahl der zu ersetzenden Leerzeichen ermitteln (und bei der Gelegenheit auch zB einen Tab als fünf Leerzeichen definieren) und die Ersetzung vornehmen.
Bin allerdings mehr am Erlernen von Regex interessiert, als am Erlernen von Perl.
Das liegt natürlich nicht an Perl, sondern an der begrenzen Zeit und Aufnahmevermögen
....alles zu seiner Zeit!

PS:
Jetzt rächt sich der Doppelpost...
 

abgdf

Guru
Bin allerdings mehr am Erlernen von Regex interessiert, als am Erlernen von Perl.
Kommt mir schon ein bißchen "wie das Pferd von hinten aufzäumen" vor. Mein Tip: Lern' erst mindestens eine Sprache (mit Kontrollstrukturen, Bedingungen, Funktionen usw.) und kümmere Dich erst dann um RegEx-Syntax.

Gruß
 
Oben