PHP - 从字符串读取变量,然后用Database中的变量替换

时间:2012-01-26 11:17:06

标签: php preg-replace

在我的PHP论坛中,我希望人们只需插入图片的编号/ ID即可插入图片(他们可以在在线图片中看到)

我正在寻找一个可以从帖子中读取字符串的函数,例如

“bla bla并看看这张惊人的照片[IMG] 234 [/ IMG]不是很棒......”

然后在ID为234的数据库中查找图片并替换为[IMG] 234 [/ IMG] <img src = "path/to/image.jpg" />

preg_replace不起作用:(有没有人有想法? 感谢您的帮助

4 个答案:

答案 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";
}