preg_replace: Ausdruck passt nicht :-(

- php
0 Powl0 frankx0 Problem gelöst
Felix Riesterer
0 amolip0 frankx0 Felix Riesterer
0 amolip
Liebe RegExperten,
ich habe eine verschachtelte Liste (<ul>), bei der ich das höchste Element in der Element-Hierarchie entfernen möchte. Damit das Ganze nicht zu einfach wird, steckt diese Liste auch noch in einem <div>-Elternelement.
Beispiel-Code:
<div>
<ul class="egal">
<li class="auch egal">Unterliste
<ul>
<li class="ebenso egal">Unter-Unterliste
<ul>
<li class="auch egal">noch mehr Kram...</li>
<li class="wurschd">und noch mehr...</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
So. Nun ist es mir bereits gelungen, das erste öffnende <ul> und das direkt darauffolgende öffnende <li> zu entfernen. Aber am Ende stehen ja nun zwei verwaiste schließende Tags, die auch noch entfernt werden müssen. Hier versagt leider mein Code, denn plötzlich ist alles an Listen-speziefischem HTML-Code weg, bis auf das umgebende <div>...
Hier mein Code:
$liste = preg_replace('~(?is)<ul class=.*?([\t ]*<ul.*)$~', '\\1', $liste);
// erfolgreich: erstes <ul> und <li> ist weg
$liste = preg_replace('~(?is)</li>.*?</ul>.*?(</div.*)$~', '\\1', $liste);
// gelingt nicht: alles von der Liste ist jetzt weg (???)
Mein Error-Log schweigt und ich muss mich wundern, warum so radikal alles entfernt wird. Wer kann mir raten?
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo Felix,
Direkt helfen kann ich Dir im Moment nicht, aber vielleicht findest Du dieses Tool ja auch so nützlich, wie ich.
netten Gruss
^da Powl
Hellihello Felix,
helps You this?
<?php
$html_code='<div>
<ul class="egal">
<li class="auch egal">Unterliste
<ul>
<li class="ebenso egal">Unter-Unterliste
<ul>
<li class="auch egal">noch mehr Kram...</li>
<li class="wurschd">und noch mehr...</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>';
preg_match("~<ul.*</ul>~s",$html_code,$matches);
var_dump($matches);
?>
Dank und Gruß,
Hellihello
helps You this?
das habe ich jetzt geflissentlich übersehen! *g*
This I know. I one year America schooltime. Long time ago. Maybe has gotten little rusty my English, or has'nt it?
Dank und Gruß,
Lieber frankx und lieber Powl,
vielen Dank für Eure Anregungen! Mittlerweile habe ich eine Lösung für mich gefunden.
Hier mein Code:
$liste = preg_replace('~(?is)<ul class=.?([\t ]<ul.*)$~', '\1', $liste);
// erfolgreich: erstes <ul> und <li> ist weg
$liste = preg_replace('~(?is)</li>.?</ul>.?(</div.*)$~', '\1', $liste);
// gelingt nicht: alles von der Liste ist jetzt weg (???)
die zweite Zeile sieht bei mir jetzt so aus:
` $liste = preg_replace('~(?is)(.*</ul>).*?</ul>.*?$~', "\\1\r\n</div>", $liste);`{:.language-php}
Das ist zwar nicht das, was ich mir vorgestellt habe, aber es "funzt", und damit soll es für heute genügen.
Liebe Grüße aus [Ellwangen](http://www.ellwangen.de/),
Felix Riesterer.
--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
Hallo Felix!
Vielleicht kannst du mit folgendem Ansatz etwas anfangen.
Modifizierer: s
Muster: ^<div.+?<ul.+?(<ul.+)</li>.+</ul>.+?</div>$
Ersetzungsmuster: <div>\1</div>
Das Muster ist quick and dirty geschrieben und ich weiß auch nicht, ob es unter den gegebenen Rahmenbedingungen, die mir nicht klar sind, überhaupt infrage kommt.
Gruß Uwe
Hellihello Uwe,
Modifizierer: s
Damit meinst Du, dass hinter dem hinteren Delimiter ein "s" kommt, damit Whitespaces auch vom "." als Platzhalter für "irgendeinzeichen" berücksichtigt werden?
Muster: "/^<div.+?<ul.+?(<ul.+)</li>.+</ul>.+?</div>$/s"
Dank und Gruß,
Lieber frankx,
Muster: "/^<div.+?<ul.+?(<ul.+)</li>.+</ul>.+?</div>$/s"
wie ich Uwe schon geschrieben hatte, enthält mein Ausdruck sowohl den Modifier "s", als auch den Modifier "i"! In PHP sieht das dann so aus:
$liste = preg_replace('~(?is)(.*</ul>).*?</ul>.*?$~', "\1\r\n</div>", $liste);
------------------------------^^ Da isser
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo frankx!
Modifizierer: s
Damit meinst Du, dass hinter dem hinteren Delimiter ein "s" kommt, damit Whitespaces auch vom "." als Platzhalter für "irgendeinzeichen" berücksichtigt werden?
Muster: "/^<div.+?<ul.+?(<ul.+)</li>.+</ul>.+?</div>$/s"
Ja, genau. Ich hab das einfach allgemein formuliert und mich nicht auf einen spezifischen RegEx-Dialekt, wie beispielsweise PHP, bezogen.
Gruß Uwe
Lieber amolip,
Modifizierer: s
den verwende ich doch!
$liste = preg_replace('~(?is)(.*</ul>).*?</ul>.*?$~', "\1\r\n</div>", $liste);
Das (?is) in meinem Ausdruck ist die PHP-Version von /....../is in z.B. JavaScript!
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo Felix!
Modifizierer: s
den verwende ich doch!
Ja, das hatte ich schon gesehen. Ich hab das einfach allgemein formuliert und mich nicht auf einen spezifischen RegEx-Dialekt, wie beispielsweise PHP, bezogen.
Apropos: Da ich davon ausgehe, dass du XHTML-Syntax verwendest, brauchst du den i-Modifizierer nicht :-)
Gruß Uwe