Ich versuche Zeilenumbrüche zwischen <table> und </table> mit PHP zu entfernen. Die Tabelle geht über mehrere Zeilen. Ich bin schon soweit, dass ich den Code matchen kann, verstehe aber den Syntax von preg_replace nicht.
Das Matching klappt schon mal mit
/(?<=\<table).*(?=\<\/table\>)/s
aber weiter bin ich noch nicht.
<p>Das ist ein test</p> <table class="testklasse" id="irgendwas"> <tr><td>Bitte nicht umbrechen</td></tr> <tr><td>Bitte auch nicht umbrechen</td></tr> </table></p> <p>Und hier auch</p>
Könnte mir jemand auf die Sprünge helfen? Herzlichen Dank!
Mich verwirrt der Satz "Bitte nicht umbrechen" in den Tabellen-Zellen wenn du innerhalb von <table> umbrechen willst. Magst du vll noch den Code des erwarteten Ergebnises posten?
Meinst du, dass bei TR automatisch umgebrochen wird? Vllt meinst du auch die automatische Umbrechung im Browser, weil in deinem Code wird nichts umgebrochen, jedenfalls nicht HTML.
Oder willst du alle "\r\n"s durch ein <p></p> ersetzen, nur nicht in Tabellen? Wieso so umständlich? Wenn du schon HTML verwendest (und nicht BBCode o.ä.), dann kannst du genauso <br /> oder <p></p> selber schreiben.
<fieldset> <legend>Group Match 1 (Alles vor <table>)</legend> <pre> <?=htmlentities($matchResult[1][0])?> </pre> </fieldset>
<fieldset> <legend>Group Match 2 (<p> direkt vor <table>)</legend> <pre> <?=htmlentities($matchResult[2][0])?> </pre> </fieldset> <fieldset> <legend>Group Match 3 (Inhalt von <table>)</legend> <pre> <?=htmlentities($matchResult[3][0])?> </pre> </fieldset> <fieldset> <legend>Group Match 4 (</p> direkt nach <table>)</legend> <pre> <?=htmlentities($matchResult[4][0])?> </pre> </fieldset> <fieldset> <legend>Group Match 5 (Alles nach <table>)</legend> <pre> <?=htmlentities($matchResult[5][0])?> </pre> </fieldset> <fieldset> <legend><p> und </p> aus Group Match 3 entfernen</legend> <pre> <?php $sub = $matchResult[3][0]; $sub = str_replace('<p>','', $sub); $sub = str_replace('</p>','', $sub); echo htmlentities($sub); ?> </pre> </fieldset> <fieldset> <legend>Alles zusammen bauen</legend> <pre> <?php echo htmlentities($matchResult[1][0]) .htmlentities($sub) .htmlentities($matchResult[5][0]) ?> </pre> </fieldset>
Ich habe also den String in mehrere Teilergebnisse zerlegt und dann wieder zusammengebaut. Ich bin sicher das es noch hübscher geht. Wer traut sich? :)
Ich wollte eigentlich automatisch jeden Umbruch in einem textfeld in "<p></p>" setzen. Ausnahme: Kommt im Text eine Tabelle vor, soll nicht umgebochen werden. War das soweit verständlich?
Ein leeres <p></p> Element sollte nicht verwendet werden. Das p - Element (Paragraph) steht semantisch für einen Absatz und ist ein Block Element. Ein reiner Zeilenumbruch ist ein <br> (bzw. <br /> im XHTML). Und dass was Du da oben als Beispiel hast ist nicht valide, denn eine Tabelle darf nicht in einem P - Element vorkommen. (Zumal nach dem /table auch nur das /p geschlossen, aber nie geöffnet wird.
Poste bitte einfach zwei Beispiele, 1) Das hab ich jetzt 2) So soll es aussehen. Und wenn du schon dabei bist, erklär uns doch auch warum du das so machen möchtest. Ich werde das Gefühl nicht los, das du dein Problem von hinten durch die Brust ins Auge lösen willst (nicht bös gemeint). Grüße
also ich verstehe die Anforderung immer noch nicht genau. Willst Du das unnötige </p> nach </table> entfernen?
Naja. Wie dem auch sei
/(?<=\<table).*(?=\<\/table\>)/s
selektiert die alles zwischen <table und </table> exclusiv und gierig (greedy). D.h. Wenn Du 2 Tabellen hast, dann alles, was in folgendem Codeblock unterstrichen ist...
<p>Das ist ein test</p> <table class="testklasse" id="irgendwas"> <tr><td>Bitte nicht umbrechen</td></tr> <tr><td>Bitte auch nicht umbrechen</td></tr> </table> <p>asd</p> <table class="testklasse" id="irgendwas anderes"> <tr><td>Bitte nicht umbrechen</td></tr> <tr><td>Bitte auch nicht umbrechen</td></tr> </table> <p>Und hier auch</p>
non-greedy wird es mit
/(?<=\<table).*?(?=\<\/table\>)/s
Damit wird beim ersten Vorkommen von </table> aufgehört.
Das Problem sind dann aber noch verschachtelte Tabellen, da dabei weder das erste, noch das letzte Vorkommen von </table> das richtige ist.. Hier geht mein php-Regex - Wissen aber aus. In .NET könnte man das noch mit balanced groups lösen. Schön ist es aber nicht mehr - HTML ist einfach keine reguläre Sprache (Regex ist es auch nicht mehr wirklich, daher geht es oft trotzdem - wird aber nicht schön).
Bei verschachtelten Strukturen stellt man das RegEx auf greedy und benutzt eine RegEx-Suchfunktion mit ein Callback. In dem Callback ruft man das RegEx auf, das ruft wieder das Callback auf und immer so weiter.