PHP Alle X Absätze besondere Ausgabe

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
719
ich lese mit PHP aus einer Datenbank einen Spalte eines Datensatzes aus, dabei handelt es sich um Texte mit mehreren <p> Absätzen. manchmal sind es mehrere, manchmal wenige. ich möchte alle X Absätze jetzt etwas dazwischen einfügen, z.B. ein Bild.

z.B. soll das bei alle 3 Absätzen so aussehen:
HTML:
<p>Absatz 1</p>
<p>Absatz 2</p>
<p>Absatz 3</p>
<img src="img.png" alt="bild">
<p>Absatz 4</p>
<p>Absatz 5</p>

Der normale Inhalt der Spalte ist so:
HTML:
<p>Absatz 1</p>
<p>Absatz 2</p>
<p>Absatz 3</p>
<p>Absatz 4</p>
<p>Absatz 5</p>

wie kann ich das umsetzen ?
 
Du gehst doch sicher mit einer Schleife durch dein Datenbankergebnis, richtig?
Da kannst du einfach mitzählen und dann eben ggf noch etwas mehr ausgeben.
 
Für mich klingt es so, als seien die mehreren P-Absätze jeweils das Ergebnis einer Row der PHP/SQL-Query. Daher bringt das mitzählen der Query-Ergebnisse nichts, man muss tatsächlich innerhalb des Query-Durchgangs manuell das jeweilige Return prüfen, ob darin z.B. ein "</p>" enthalten ist - wiederum in einer Schleife, und alle 3 Durchgänge eben selbst etwas anhängen. Das ginge z.B. mit strpos(), das man so lange auf den Rest des Ergebnisses anwendet, bis es false zurückgibt.
 
Du könntest auch mit explode("</p>", $deinHtml) aus deinem HTML mit allen Absätzen ein Array bilden, dann hast du pro Item einen Absatz in dem Array.
Funktioniert recht gut solange du wirklich nur Absätze zählen musst.

Rest ist nur in ner Schleife durch das Array gehen und mitzählen wo du dein Bild haben willst.
 
ja genau alle Absätze sind in einer row.

Joshinator schrieb:
Du könntest auch mit explode("</p>", $deinHtml) aus deinem HTML mit allen Absätzen ein Array bilden, dann hast du pro Item einen Absatz in dem Array.
Wie genau geht das ?
 
Zuletzt bearbeitet:
Explode return ein Array, du geht mit foreach durch das Array, echost das Array-Element und wenn der Index ohne Rest durch 3 teilbar ist gibt du zusätzlich dein Bild aus.
 
  • Gefällt mir
Reaktionen: netzgestaltung und Pfandfinder
mir ist jetzt aufgefallen dass mein Script immer noch ein letztes nicht vorhandeses Array durchgeht und daher im Serverlog immer der Error
Code:
Undefined offset: 5

erscheint:

PHP:
$content = '<p>Absatz eins</p><p>Absatz zwei</p><p>Absatz drei</p><p>Absatz vier</p>';

$array = explode('</p>', $content);

echo str_replace('<p>', '<p><b>', str_replace('</p>', '</p></b>', $array[0])).'</b></p>';

$i = 0;

foreach($array AS $content)
{
    $i++;
    echo $array[$i];
}

Wie behebe ich das ? es liegt irgendwie an dem echo von dem array 0, denn entferne ich die Zeile und mache $i = -1, kommt der fehler nicht.
 
Zuletzt bearbeitet:
Was ist denn der Sinn von einer foreach + einem counter? Du gehst doch mit der foreach schon durch das array. Außerdem erhöhst du den Counter bevor du ihn benutzt. D.h. dein erster Zugriff auf das Array ist array[1] und nicht array[0], was der eigentliche Anfang wäre. Da du mit foreach durch das gesamte array läufst, greifst du beim letzten Zugriff außerhalb des arrays. Das passiert dir dann nicht, wenn du wie du sagt das i so initialisierst.
PHP:
$i = -1;
. Also warum dann überhaupt i verwenden, es ist hier überhaupt nicht nötig?

Wie so oft ist hier ein RTFM angebracht. Ich würde mich nochmal intensiv mit mehr Grundlagen beschäftigen.
 
PHP:
$dataset = '<p>Absatz 1</p>
<p>Absatz 2</p>
<p>Absatz 3</p>
<p>Absatz 4</p>
<p>Absatz 5</p>';

// html tag name
$htmlTagName = 'p';

$htmlTag = "</$htmlTagName>";
$list = explode($htmlTag, $dataset);

// position of the new element
$position = 3;

// insert the new element
$list[$position - 1] = '<img src="img.png" alt="bild">' . $list[$position - 1];

// put together & set new line for a homogen look (not necessary)
$new = str_replace(
    '><',
    ">\n<",
    implode($htmlTag, $list)
);

// debug print
print_r($new);

Auch noch ein Vorschlag von mir.

Wenn sowas aber öfter gebraucht wird würd ich einfach ne Bibliothek empfehlen die extra dafür geschrieben wurde um in HTML rumzupfuschen.
https://symfony.com/doc/current/components/dom_crawler.html
https://symfony.com/doc/current/components/css_selector.html
 
Zuletzt bearbeitet:
Bitteschön. Tut was es soll, also fügt alle 3 Zeilen das img-Tag ein. Du kannst das Intervall und den einzufügenden Text aber auch easy anpassen.

PHP:
<?php
$content = '
<p>Absatz eins</p>
<p>Absatz zwei</p>
<p>Absatz drei</p>
<p>Absatz vier</p>
<p>Absatz fünf</p>
<p>Absatz sechs</p>
<p>Absatz sieben</p>';

$interval = 3;
$insert = '<img src="img.png" alt="bild">';

$array = explode('<p>', $content);

for($i=1; $i < count($array); $i++) {
    if( $i % $interval == 0) {
        $array[$i] = $array[$i] . $insert . "\n";
    }
}

$content = implode('<p>', $array);

//Falls du noch deine b-Tags einfügen willst, folgende 2 Zeilen auskommentieren:
//$content = str_replace('<p>', '<p><b>', $content);
//$content = str_replace('</p>', '</b></p>', $content);

echo $content;
?>
 
Zuletzt bearbeitet:
Zurück
Oben