Frage String zwischen zwei Strings

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.148
237
63
19
Hey Forum,

also das Problem steht eigentlich schon im Titel:
Ich habe hier folgenden String:
"[bla]Textawdawd[/bla]"
und möchte jetzt den Text dazwischen raus haben.

Alles kein Problem:
PHP:
$meinString = '[bla]Textawdawd[/bla]';

function get_string_between($string, $start, $end) {
    $string = ' ' . $string;
    $ini = strpos($string, $start);
    if ($ini == 0) {
        return '';
    }
    $ini += strlen($start);
    $len = strpos($string, $end, $ini) - $ini;
    return substr($string, $ini, $len);
}

echo get_string_between($meinString, '[bla]', '[/bla]');
(Modifiziert aus: https://stackoverflow.com/questions/5696412/how-to-get-a-substring-between-two-strings-in-php)

Mein Problem besteht darin, dass der String aber auch so aussehen kann:
'[bla]Textawdawd[/bla] Noch mehr Text [bla]AndererText[/bla]';

Jetzt muss einmal 'Textawdawd' & 'AndererText' ausgelesen werden und in ein Array eingelesen werden.
Und das ist meine Frage: Wie mache ich das?
 

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.148
237
63
19
:confused: Ich ärger mich gerade so ein bisschen, dass ich da so viel Zeit investiert habe... Ich muss unbedingt wieder mehr PHP machen.
Wie auch immer, hier ist der Code:
PHP:
$string = "[bla]awdawd[/bla]awd[bla]awdawd[/bla]";

preg_match_all('/\[bla\](.*?)\[\/bla\]/s', $string, $matches);
print_r($matches[1]);

Danke Tronjer für das Stichwort und falls dir noch was auffällt, dann sagen.
 

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.148
237
63
19
Ich bins doch nochmal.

Ich glaube, ich geb nochmal ein bisschen mehr Hintergrundinformationen, vielleicht fallen euch noch ein paar andere Wege ein:
Also in diesen Strings steht in den Tags ein Tablename für eine mysql Tabelle.
à la:
Code:
/* Tabelle:
*  beispielcolumn      andere_beispielcolumn
*  Wert1               Wert2
*  Wert1_1             Wert2_1
*  usw.                usw._2
*/


$tablename = 'beispieltabelle';
$string = '[column]beispielcolumn[/column] Hier steht dann noch mehr Text [column]andere_beispielcolumn[/column]';


preg_match_all('/\[column\](.*?)\[\/column\]/s', $string, $matches);
/* $matches[1] sieht dann so aus:
*  Array ( [0] => beispielcolumn [1] => andere_beispielcolumn )
*/

$sql = "SELECT * FROM $tablename";
$result = $conn->query($sql);

while ($row = $result->fetch_assoc()) {
   echo '<option>'./* Hier ist die Problemstelle */.'</option>';
}

Als output möchte ich dann folgendes haben:
HTML:
<option>Wert1 Hier ist dann noch mehr Text Wert2</option>
<option>Wert1_1 Hier ist dann noch mehr Text Wert2_1</option>
<option>usw. Hier ist dann noch mehr Text usw._2</option>

Ich habe versucht mit preg_replace zu arbeiten, aber er replacet dann ja alles was in den Tags steht mit nur einem Wert, sodass dann rauskommt:
HTML:
<option>Wert1 Hier steht dann noch anderer Text Wert1</option>
usw.

Wie kriege ich also den gewünschten Output hin?
 

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.144
428
83
68
Sehr skeptisch, ob ich das richtig verstanden habe, aber hier ein Versuch:
Code:
$tablename = 'beispieltabelle';
$string = '[column]beispielcolumn[/column] Hier steht dann noch mehr Text [column]andere_beispielcolumn[/column]';
$pattern = '/\[column\](.*?)\[\/column\](.*)\[column\](.*?)\[\/column\]/s'
preg_match($pattern, $string, $matches);

$sql = "SELECT * FROM $tablename";
$result = $conn->query($sql);

while ($row = $result->fetch_assoc()) {
   echo '<option>' . $row[matches[1]] . matches[2] . $row[matches[3]] . '</option>';
}
 
Zuletzt bearbeitet:

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.148
237
63
19
Ja du hast es (fast) richtig verstanden, ich habe vergessen zu erwähnen, dass der $string natürlich variiert.
Stell dir vor, du müsstest deinen String in einen <input> eingeben.
Er könnte auch so aussehen:
Hier steht [column]beispielcolumn_3[/column] dann noch mehr Text [column]andere_beispielcolumn[/column] [column]beispielcolumn[/column]

Was ich bis jetzt hinbekommen habe ist, dass der Text in den Tags (egal wie der String aussieht) in ein Array eingelesen wird.
Code:
Array ( [0] => beispielcolumn [1] => andere_beispielcolumn )

und zwar auch in der Reihenfolge, bsp.:
Code:
$string = Hier steht [column]Irgendwas[/column] dann noch mehr Text [column]Schönes_Wetter[/column] [column]blabla[/column];
wäre dann:
Code:
Array ( [0] => Irgendwas [1] =>Schönes_Wetter [2] => blabla)

Es müsste also sozusagen das nth match mit dem nth Eintrag vom Array replaced werden.
Hört sich für mich wie eine Schleife an:
PHP:
for ($y = 0; $y <= sizeof($array_name) - 1; $y++) {}
Aber genau soweit war ich auch schon.

In dem Falle müsste ich also das $y-te Match mit dem $y-ten Eintrag vom Array ersetzen.
Also:
Code:
$string = Hier steht [column]Irgendwas[/column] dann noch mehr Text [column]Schönes_Wetter[/column] [column]blabla[/column];

wird zu:

Hier steht $row['Irgendwas'] dann noch mehr Text $row['Schönes Wetter'] $row['blabla']

Edit:
Mir ist gerade eingefallen, dass man ja theoretisch einfach nur
[column] durch $row['

und [/column] durch ']

ersetzen müsste.
Das geht wiederum nicht, da ja $row[' als Fehlermeldung (bei Anführungszeichen) und als String (bei Apostroph) gehandelt werden würde.
Gibts da einen Weg das zu verhindern?

PHP:
preg_replace('/\[column\]/s', "$row['", $string);

preg_replace('/\[\/column\]/s', "']", $string);
 
Zuletzt bearbeitet:

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.144
428
83
68
Glaube, jetzt verstehe ich es. Neuer Versuch (testweise mit einem Array statt DB):

PHP:
$values = [
    'cola'=>'vala',
    'colb'=>'valb',
    'colc'=>'valc',
    'cold'=>'vald',
];
$string = '[column]cola[/column] Hier steht Text [column]colb[/column]
    Hier steht anderer Text [column]colc[/column]
    Hier steht noch mehr Text [column]cold[/column]';
$pattern = '/\[column\](.*?)\[\/column\]/s';
$i = 0;
$resultstr = preg_replace_callback($pattern, function($matches) {
    global $values;
    var_dump($matches);
    return $values[$matches[1]];
}, $string);
var_dump($resultstr);
 
  • Like
Reaktionen: Aaron3219

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.148
237
63
19
:cool: Coole Nummer. Mit preg_replace_callback habe ich vorher noch nie gearbeitet.
 
Werbung: