regular expressions
wizz99
- php
0 wahsaga
hallo liebes forum,
es ist zum verzweifeln. ich habe mir jetzt seit gut 2 stunden diverse anleitungen und hilfestellungen zu regex im internet durchgelesen, aber ich komme zu keinem ergebnis. ich hoffe, dass hier irgendjemand ist, der vielleicht eine lösung oder einen lösungsansatz hat (ich denke, es geht hier um maximal 10 zeichen, die mir fehlen oder die falsch sind).
problem:
ich habe einen string, der unter anderem einen (oder mehrere) <SPAN>-bereich enthält bzw enthalten kann:
$test = 'das ist ein test. <SPAN id="nummer1" style="color:#000000;">blubb.</SPAN> hier gehts dann fröhlich weiter. <SPAN id="nummer2" style="color:#ff0000;">test.</SPAN> noch mehr text';
nun möchte ich z.b. den ersten span-bereich per eregi_replace (PHP) ersetzen und dann ausgeben, bisher hab ich das so gemacht:
echo eregi_replace('<SPAN id="nummer1".*[^</SPAN>]</SPAN>','WEG',$test);
diese lösung klappt soweit ganz gut, allerdings nur in solchen fällen, in denen in dem string $test nur EIN span-bereich ist. denn diese lösung "übersieht" das ende des ersten span (</SPAN>) und nimmt dann das ende des zweiten span als absolutes ende des suchergebnisses.
es liegt wohl daran, dass [^</SPAN>] eben nicht "</SPAN>" ausschließt, sondern jedes zeichen einzeln. zumindest vermute ich das. wie kann ich dann angeben, dass ich wirklich "</SPAN>" als string ausschließen möchte?
vielen vielen dank im voraus,
mit freundlichen grüßen,
wizz99.
hi,
diese lösung klappt soweit ganz gut, allerdings nur in solchen fällen, in denen in dem string $test nur EIN span-bereich ist. denn diese lösung "übersieht" das ende des ersten span (</SPAN>) und nimmt dann das ende des zweiten span als absolutes ende des suchergebnisses.
reguläre ausdrücke sind "gierirg", englisch "greedy" - sie versuchen immer den längstmöglichen treffer zu finden.
bei den preg_-funktionen gibt es dazu sog. modifier; wie die bei ereg heißen müssen, weiß ich aber gerade nicht (zu lange nicht mehr benutzt).
gruß,
wahsaga
reguläre ausdrücke sind "gierirg", englisch "greedy" - sie versuchen immer den längstmöglichen treffer zu finden.
bei den preg_-funktionen gibt es dazu sog. modifier; wie die bei ereg heißen müssen, weiß ich aber gerade nicht (zu lange nicht mehr benutzt).
Ich möchte behaupten, dass sich Optionen (wenn es denn solche überhaupt gibt) in PHP bei den erweiterten regulären Ausdrücken (extended regex) nicht angeben lassen, nur bei den Perl-kompatiblen (PCRE).
Ich möchte behaupten, dass sich Optionen (wenn es denn solche überhaupt gibt) in PHP bei den erweiterten regulären Ausdrücken (extended regex) nicht angeben lassen, nur bei den Perl-kompatiblen (PCRE).
es gibt solche optionen/modifiers, allerdings wirklich nur PCRE.
zitat:
U (PCRE_UNGREEDY)
This modifier inverts the "greediness" of the quantifiers so that they are not greedy by default, but become greedy if followed by "?". It is not compatible with Perl. It can also be set by a (?U) modifier setting within the pattern.
aber auch mit eregi_replace ist es möglich, das ganze "ungreedy" zu machen. wenn ich den inhalt eines tags rausbekommen will, dann frag ich das ganze ja so ab: "<[^>]*>", also: zeige mir alles was zwischen "<" und ">" steht, und zwar ohne dass ">" dazwischen nochmal vorkommt. und das selbe würd ich jetzt gerne so machen, dass eben "</SPAN>" nicht vorkommen darf. nur geht das nicht mit [^</SPAN>], weil das mehrere zeichen sind.
kann man nicht irgendwie sagen, dass ein *string* ("</SPAN>") nicht vorkommen darf? oder geht das tatsächlich nur mit einzelnen zeichen?
vielen dank,
wizz99
Hi,
aber auch mit eregi_replace ist es möglich, das ganze "ungreedy" zu machen. wenn ich den inhalt eines tags rausbekommen will, dann frag ich das ganze ja so ab: "<[^>]*>", also: zeige mir alles was zwischen "<" und ">" steht, und zwar ohne dass ">" dazwischen nochmal vorkommt. und das selbe würd ich jetzt gerne so machen, dass eben "</SPAN>" nicht vorkommen darf. nur geht das nicht mit [^</SPAN>], weil das mehrere zeichen sind.
Reicht es dir vielleicht, das Stück '[^>]*>' doppelt anzuwenden? Die RegExp
'<SPAN id="nummer1"[^>]*>[^>]*>'
dürfte eigentlich nur das erste span fressen. Es darf allerdings kein anderer Tag innerhalb des spans stehen.
Gruß,
Andreas.
Reicht es dir vielleicht, das Stück '[^>]*>' doppelt anzuwenden?
hallo,
mhh nein, in diese richtung hatte ich auch schon gedacht, jedoch kommen in den span-bereichen auch weitere tags vor - im beispiel hab ich diese aber weggelassen.
gibt es da wirklich keine lösung? :( eigtl klingts doch so simpel :(
vielen dank!
wizz99
ok, ich habe die lösung, eher durch zufall gefunden. :) für alle, die den thread mitverfolgt haben und sich dafür interessieren.
preg_replace("'<SPAN id="nummer1".*</SPAN>'U","WEG",$test);
wichtig dabei ist das U zwischen dem ' und dem " - 'U" -> damit wird die PCRE-option "ungreedy" angewandt und sorgt somit dafür, dass nach dem ersten gefundenen "</SPAN>" die suche zu ende ist.
danke nochmals an alle hilfestellungen,
die sache mit den PCRE-optionen war wohl der richtige schritt.
wizz99
gudn tach!
preg_replace("'<SPAN id="nummer1".*</SPAN>'U","WEG",$test);
oder
preg_replace('!<SPAN id="nummer1".*?</SPAN>!','WEG',$test);
, oder?
prost
seth