Suchmuster in String finden und ersetzen.
Kai
- php
Hallo,
ich habe folgende Funktion geschrieben um einen Teilstring aus einem Text herauszulesen und dieses Suchmuster dann durch ein Bild zu ersetzen. Das klappt für ein Bild pro String auch wunderbar, aber wenn ich nun n Bilder auf diese Weise in den Text einfügen möchte, passt es natürlich nicht mehr so ganz.
Ein Text sähe z. B. vorher so aus:
Das ist der Text mit dem Bild ::1133.jpg::
Und danach so:
Das ist der Text mit dem Bild <img src="images/1133.jpg" alt="Der Marktplatz" width="600" height="400">
Bei mehreren Bildern wäre er dann:
Das ist der Text mit dem Bild ::1133.jpg:: und dem Bild ::1254:: Was ist davon zu halten?
Klar, macht das nicht unbedingt Sinn, aber ich bräuchte die theoretische Möglichkeit n Bilder in den Text einzufügen. Muss ich das rekursiv lösen oder geht das auch mit Stringfunktionen?
function checkForImages($str)
{
$alt = "alt_".$_SESSION['lang'];
$has_image = ereg("::[0-9].*.jpg::", $str);
if ($has_image)
{
$pos_1 = strpos($str, "::");
$pos_2 = strrpos($str, "::");
$name = substr($str, $pos_1 + 2, $pos_2 - $pos_1 - 3);
$replace = substr($str, $pos_1, $pos_2 - $pos_1);
$query = "
SELECT
name,
$alt,
directory,
size
FROM
images
WHERE
name = '$name'
";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
mysql_free_result($result);
$alt = $row[$alt];
$dir = $row['directory'];
$size = $row['size'];
$img_src_str = "<img src="".$dir.$name."" ".$size." alt="".$alt."">";
$new_string = str_replace($replace, $img_src_str, $str);
$checked_text = $new_string;
}
else
{
$checked_text = $str;
}
return $checked_text;
}
Viele Grüße,
Kai
hi,
für deine aufgabe bieten sich reguläre ausdrücke an.
nicht ganz trivial, aber dafür sehr mächtig.
erster ansatzpunkt zum einlesen in die materie unter php: http://de3.php.net/manual/de/ref.pcre.php.
gruss,
wahsaga
Danke für die Reaktion. :-) Ich hatte es zwischenzeitlich wie folgt gelöst:
function checkForImages($str)
{
$table = $param_db_prefix."_image";
$alt = "alt_".$_SESSION['lang'];
// Prüfe im gesamten String, ob Bilder vorkommen.
$has_image = ereg("!.*.jpg|", $str);
if ($has_image)
{
$pos_1 = strpos($str, ".jpg|"); // erstes Bild im String
$prev_str = substr($str, $str, $pos_1 + 7); // Erster String-Teil.
$pos_2 = strpos($prev_str, "; // erstes Vorkommen des ::
$pos_3 = strrpos($prev_str, ".jpg|"); // letztes Vorkommen des ::
$image_name = substr($prev_str, $pos_2 + 7, $pos_3 + 2 - $pos_2 - 5); // Name des Bildes
$replace = substr($prev_str, $pos_2, $pos_3 + 6 - $pos_2 + 1); // zu ersetzender Teil mit img-Tag
// Prüfe, ob align = center, left oder right in diesem Teil-String.
$image_center = ereg("[image:[0-9).*.jpg|c]", $prev_str);
$image_left = ereg("!.*.jpg|l]", $prev_str);
$image_right = ereg("!.*.jpg|r]", $prev_str);
$next_str = substr($str, $pos_1 + 7); // Rest-String
$checked_text = checkForImages($next_str);
$query = "
SELECT
name,
$alt,
directory,
size
FROM
$table
WHERE
name = '$image_name'
";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
mysql_free_result($result);
if($image_center == true)$align = "center";
if($image_left == true)$align = "left";
if($image_right == true)$align = "right";
$alt = $row[$alt];
$dir = $row['directory'];
$size = $row['size'];
// img-Tag, das an Stelle von ::xxxx.jpg|?:: eingesetzt werden soll.
$img_src_str = "<img src="".$dir.$image_name."" align="".$align."" ".$size." alt="".$alt."">";
// Den neuen String zusammensetzen.
$new_string = str_replace($replace, $img_src_str, $prev_str).$checked_text;
$checked_text = $new_string;
}
else
{
$checked_text = $str;
}
return $checked_text;
}