PHP Regex um String zu ersetzen

C

Cave Johnson

Gast
Hi,

ich habe Strings in folgender Form:

  • "<ul><li>a: ok</li><li>b: ok</li><li>c: unbekannt</li><li>d: ok</li></ul>"
  • "<ul><li>g: ok</li><li>h: ok</li><li>i: ok</li><li>j: unbekannt</li></ul>"
  • "<ul><li>l: ok</li><li>m: ok</li><li>n: ok</li></ul>"
  • "<ul><li>x: unbekannt</li><li>y: ok</li><li>z: ok</li></ul>"
Es gibt also teilweise Listenpunkte, in denen unbekannt steht. Diese können überall innerhalb des Strings stehen; also als erstes <li>, irgendwo in der Mitte oder am Ende.

Ich möchte alle li-s löschen, in denen unbekannt steht, am Ende sollte das Ganze also so aussehen:

  • "<ul><li>a: ok</li><li>b: ok</li><li>d: ok</li></ul>"
  • "<ul><li>g: ok</li><li>h: ok</li><li>i: ok</li></ul>"
  • "<ul><li>l: ok</li><li>m: ok</li><li>n: ok</li></ul>"
  • "<ul><li>y: ok</li><li>z: ok</li></ul>"

Kann mir jemand verraten, wir der reguläre Ausdruck für preg_replace dafür aussehen muss?

Ich kann ja folgendes machen: preg_replace("#\<li\>.*unbekannt\<li\>#", "", $str); - aber das findet ja das allererste <li>, nicht das, welches unmittelbar vor unbekannt steht.
 
@Cave Johnson

Ich habs mal in notepad++ probiert:
Code:
<li>[a-z]: unbekannt</li>

Funktioniert, ohne dass du auf non-greedy stellst.

Code:
.*
ist imo in deinem Fall keine gute Idee, da es soviele beliebige Zeichen wie möglich matcht.
Bei dir ist ja ziemlich genau bekannt, wie die zu ersetzenden Zeichenketten aufgebaut sind.
 
Zuletzt bearbeitet:
preg_replace("#\<li\>.*?unbekannt\<li\>#", "", $str);

sollte funktionieren...


HTH

BigNum
 
BigNum schrieb:
preg_replace("#\<li\>.*?unbekannt\<li\>#", "", $str);

sollte funktionieren...

das das NICHT funktioniert, hat er ja schon festgestellt:

Cave Johnson schrieb:
Ich kann ja folgendes machen: preg_replace("#\<li\>.*unbekannt\<li\>#", "", $str); - aber das findet ja das allererste <li>, nicht das, welches unmittelbar vor unbekannt steht.


und zwar genau aus dem Grund.
Auch wenn es non-greedy ist, hört die Verarbeitung bei dem String auf, welcher nach dem Fragezeichen kommt - davor wird alles ordnungsgemäß weg ersetzt

Wenn die Zeichenfolge absehbar ist, dann ist die Lösung von grantig die beste; am definiertesten und somit am wenigstens tolerant -> weniger fehleranfällig
Wenn du flexibler sein musst, hilft es auch, bestimmte Zeichen auszuschließen
z.B.
Code:
preg_replace('/<li>[^<\/>]*?unbekannt<\/li>/', "", $string);
-> es wird ALLES ausser "<",">" und "/" gematched, somit fallen HTML Entities raus, die zwischen den li Tags stehen dürfen -> es werden nur einzelne <li>[text]</li> blöcke gematched
 
Zurück
Oben