在我的PHP论坛中,我希望人们只需插入图片的编号/ ID即可插入图片(他们可以在在线图片中看到)
我正在寻找一个可以从帖子中读取字符串的函数,例如
“bla bla并看看这张惊人的照片[IMG] 234 [/ IMG]不是很棒......”然后在ID为234的数据库中查找图片并替换为[IMG] 234 [/ IMG]
<img src = "path/to/image.jpg" />
preg_replace不起作用:(有没有人有想法? 感谢您的帮助
答案 0 :(得分:2)
我会这样做:
$images = array();
$post = preg_replace_callback('|\[img\](\d+)\[/img\]|i', function($matches) use(&$images) {
$images[] = $matches[1];
return '__image_' . $matches[1];
}, $post);
if (count($images)) {
// Select images
$imageIds = implode(',', $images);
// DB query
$res = mysql_query("SELECT id, path FROM post_images WHERE id IN ({$imageIds})") or die(mysql_error());
// Replace
while (($row = mysql_fetch_assoc($res))) {
$post = str_replace('__image_'.$row['id'], '<img src=' . $row['path'] . ' />', $post);
}
}
优点是您只对数据库进行一次查询。这对于最小化它们以提高性能始终很重要。如果你不在乎或者你确定图片的数量不会太高,你可以简单地使用这段代码:
$post = preg_replace_callback('|\[img\](\d+)\[/img\]|i', function($matches) {
$res = mysql_query("SELECT path FROM post_images WHERE id = {$matches[1]}") or die(mysql_error());
$path = mysql_result($res, 0);
return "<img src='$path' />";
}, $post);
答案 1 :(得分:2)
这就是我所做的:
$find = preg_match_all("!\[img\][0-9]+\[\/img\]!", $post, $matches);
foreach ($matches as $match) {
foreach ($match as $ma) {
$res = str_replace("[/img]","", str_replace("[img]", "",$ma));
$query = "
SELECT
path
FROM
table
WHERE id = '".$res."'
";
$result = mysql_query($query, $conn) or die(mysql_error());
while($line = mysql_fetch_array($result)) {
$path = $line["path"];
$path = "<img src = '".$path. "'></img>";
$post = str_replace ("[img]" . $res . "[/img]", $path, $post);
}
}
}
注意:我不知道为什么preg_match_all会创建一个2深度数组
答案 2 :(得分:0)
您的代码需要进行数据库调用才能从ID获取路径。
使用标记解析器或基本正则表达式匹配\[img][0-9]+\[/img]
。 (的preg_match)
然后在数据库中查询匹配结果为ID的路径。
最后,使用str_replace
将原来的“[img] $ match [/ img]”替换为
示例(伪,首先查看这些函数)
$matches = preg_match_all('\[img][0-9]+\[/img]', $input);
$output = $input;
foreach ($matches as $match) {
$cur = mysql_query("SELECT path FROM table WHERE ID = $match");
$row = mysql_fetch_array($cur);
$output = str_replace('[img]'.$match.'[/img]',$row['path'],$output);
}
注意:这只适用于较低版本的标签:img而不适用于IMG,iMG,ImG等。
答案 3 :(得分:0)
为什么preg_replace没有工作?不知道细节,我猜你没有逃避方括号。你的正则表达式是什么样的?尝试像
这样的东西/\[IMG\](\d+)\[/IMG]/
图像ID将在组1中,即$ 1。
示例:
preg_match_all('/\[IMG\](\d+)\[/IMG]/', $post, $matches);
foreach ($matches as $match) {
echo "Image number: " . $match[1] . "\n";
}