2012-01-26 56 views
1

剛剛插入的圖片數量/ ID(他們可以在網上畫冊見)PHP - 讀取字符串變量,然後用變量從數據庫

我代替我的PHP論壇上,我希望人們能插入圖片正在尋找能夠讀取自己的崗位字符串例如

功能「喇嘛喇嘛,並期待在這個令人驚異的畫面[IMG] 234 [/ IMG]是不是真棒......」

然後在ID爲234的數據庫中找到圖片,並用 替換[IMG] 234 [/ IMG] <img src = "path/to/image.jpg" />

preg_replace不會工作:(有沒有人有想法? 感謝您提前給予的幫助

+0

您可以發佈您到目前爲止嘗試過的嗎?這感覺就像你試圖得到一個完整的解決方案,那不是什麼StackOverflow是關於:) –

+0

不是一個真正的完整的解決方案,只是關鍵的想法;) –

回答

0

您的代碼需要進行數據庫調用才能從ID中獲取路徑。

使用標記解析器或基本正則表達式來匹配\[img][0-9]+\[/img]。 (preg_match)

然後在數據庫中查找匹配結果作爲ID的路徑。

最後,使用str_replace

實例,以取代原來的 「[IMG] $匹配[/ 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); 
} 

注:這將只在lowercasse中使用標籤:img,而不是IMG,iMG,ImG等。

+0

謝謝你,虐待它馬上試試:) –

+0

我不明白, preg_match只是返回true或false,不是嗎? –

+0

$ matches將在您的案例中爲1或0 –

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"; 
} 
+0

該模式不是問題,我「很難」將字符串中的id隔離並將其放入我的查詢函數 –

+0

新增示例。在這裏有兩件事要注意:1.通過將正則表達式的那部分放在括號中來選擇要提取的數字。 2.通過第三個參數檢索匹配preg_match [_all]。 – Supr

+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); 
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個深度數組

+0

順便說一句,有沒有人知道如果效果,你的帖子從橙色到白色的淡出是HTML5/CSS功能?如果是,那叫什麼? –

+1

它很容易實現使用jQuery動畫。 CSS用於描述轉換(即開始橙色然後漸變爲白色)。 jQuery處理中間色和時間等。 – deed02392