Regulärer Ausdruck
André Laugks
- programmiertechnik
0 Cheatah
Hallo!
Ich möchte in einem Quelltext <font color=#ff0000>...</font> durch <span style="color:#ff0000">...</span> ersetzen.
$quelltext = preg_replace("/<font\s+color=(#[a-z0-9]+)>(.*)</font>/i", "<span style="color:$1">$2</span>", $quelltext);
Das funktioniert auch fast, weil Leider der Quelltext folgendermaßen abgeändert wird, was nicht gaz richtig ist.
<span color="#ff0000">Hier kommt die Maus</font> <font size=2>und der Nicholaus</span>
Klar, durch "(.*)" wird alles bis zum letzten </font> gefunden.
Mit folgendem Konstrukt funktioniert es:
$string = preg_replace('/<font\s+color=(#[a-z0-9]+)>([\w\s.:,;"'/?+&§()-]+)</font>/i', '<span style="color:$1">$2</span>', $string);
<span color="#ff0000">Hier kommt die Maus</span> <font size=2>und der Nicholaus</font>
Ich habe versucht alle möglichen Zeichen die vorkommen könnten aufzunehmen, sicherlich habe ich welche vergessen, was das Problem sein könnte.
Mir fällt leider nicht ein, wie ich das erste Beispiel so ändern kann, daß es richtig funktioniert.
MfG, André Laugks
Hi,
Klar, durch "(.*)" wird alles bis zum letzten </font> gefunden.
es sei denn, man löst per Fragezeichen die Greediness auf.
Ich habe versucht alle möglichen Zeichen die vorkommen könnten aufzunehmen, sicherlich habe ich welche vergessen,
Warum listest Du dann nicht einfach alle auf, die _nicht_ vorkommen dürfen?
Cheatah
Hallo!
es sei denn, man löst per Fragezeichen die Greediness auf.
Ähhmmm? Das sagt mir jetzt nichts.
Warum listest Du dann nicht einfach alle auf, die _nicht_ vorkommen dürfen?
Es darf alles vorkommen! Nur ich kenne keine Klasse dafür. Mit \w habe ich [a-zA-Z0-9_] und mit \s [\n\r\f\t]. Für den Rest wie Satzzeichen etc. kenne ich keine Klasse.
Mit dem Punkt "." schließe ich alle ein und somit habe ich wieder das Problem. Das < und > kann ich nicht ausschließen, da andere Tags wie <b> vorkommen dürfen, was ich vergessen hatte zu schreiben.
MfG, André Laugks
Hallo André,
es sei denn, man löst per Fragezeichen die Greediness auf.
Ähhmmm? Das sagt mir jetzt nichts.
perldoc -q greedy:
What does it mean that regexes are greedy? How can I get around it?
Most people mean that greedy regexes match as much as they can.
Technically speaking, it's actually the quantifiers ("?", "*",
"+", "{}") that are greedy rather than the whole pattern; Perl
prefers local greed and immediate gratification to overall greed.
To get non-greedy versions of the same quantifiers, use ("??",
"*?", "+?", "{}?").
An example:
$s1 = $s2 = "I am very very cold";
$s1 =~ s/ve.*y //; # I am cold
$s2 =~ s/ve.*?y //; # I am very cold
Notice how the second substitution stopped matching as soon as it
encountered "y ". The "*?" quantifier effectively tells the
regular expression engine to find a match as quickly as possible
and pass control on to whatever is next in line, like you would if
you were playing hot potato.
Grüße,
CK
Hi,
Warum listest Du dann nicht einfach alle auf, die _nicht_ vorkommen dürfen?
Es darf alles vorkommen!
"alles bis auf", was sich leicht formulieren lässt; siehe perldoc perlre.
Nur ich kenne keine Klasse dafür.
Jede theoretisch denkbare Zeichenklasse existiert mit mindestens einer Schreibweise, die sehr sprechend ist,
Mit \w habe ich [a-zA-Z0-9_]
im Gegensatz zu Deinem Beispiel "\w". Die sprechende Schreibweise nennst Du ja selbst.
Für den Rest wie Satzzeichen etc. kenne ich keine Klasse.
"[,.!?]" o.ä. finde ich nicht gerade schwer zu merken.
Mit dem Punkt "." schließe ich alle ein
Nicht in einer Zeichenklasse. Ob Du eine solche benötigst, sei nebenbei mal dahingestellt.
Das < und > kann ich nicht ausschließen, da andere Tags wie <b> vorkommen dürfen, was ich vergessen hatte zu schreiben.
Ja, in der Tat. Du hast dann nämlich tendenziell ein strukturelles Problem, so dass Mustererkennung ggf. nicht mehr ausreicht.
Cheatah