1

BBCode に似たユーザー エントリに基づいてページに画像を動的に挿入する単純化されたコードを作成しようとしています。

たとえば、ユーザーの 1 人が「アヒル [image]アヒル [/image] が好き」と入力した場合、[image]アヒル [/image] を爆発させ、MySQL でキーワード「アヒル」を検索し、画像パスをプルします。 & 一致するデータベースから名前を取得し、画像の HTML コードと画像のソースを表示します。

function image_replace($dimg){
    list($title) = explode("[image]",$dimg);
    $query_image = mysql_query("SELECT * FROM images WHERE image_title LIKE '%$title%'");
    $fetch_image = mysql_fetch_array($query_image);
    $image_path = $fetch_image['image_path'];
    $image_filename = $fetch_image['image_filename'];
    $image_source = $image_path.$image_filename;
    $dimg = str_replace("[image]","<img src=\"$image_source\">", $dimg);
    $dimg = str_replace("[/image]","</img>", $dimg);
    $dimg = str_replace("$title", "", $dimg);
    return $img;
  }

image_replace($ducks);

私がぶつかっている壁は、動的に生成されたページ内のテキストが存在する場合はそれを置き換える方法であり、コードが存在しない場合はコンテンツをそのままにしておく方法です。何か案は?


編集 - 問題を複雑にする:

助けてくれてありがとう!あなたの入力を使用して、次の関数を作成しました。

function image_replace($string){
    $matches = array();
    preg_match('/\[image\](.*)\[\/image\]/', $string, $matches);
    $image = $matches[1];
    $query_image = mysql_query("SELECT * FROM images WHERE image_title LIKE '%$image%'");
    $fetch_image = mysql_fetch_array($query_image);
    $image_path = $fetch_image['image_path'];
    $image_filename = $fetch_image['image_filename'];
    $image_source = $image_path.$image_filename;
    $image_url = "<img src=\"$image_source\"></img>";
    $new_string = preg_replace('/\[image\](.*)\[\/image\]/', $image_url, $string);

    return $new_string;
  }

発生するインスタンスの数に関係なく、これが機能する必要があります (したがって、ユーザーが [image]duck[/image] と書いてから、2 つの文の後で [image]cow[/image] と書いた場合、関数で両方をそれぞれに置き換える必要があります)。結果)。現状では、インスタンスが複数ある場合、(有効な SQL リソースではなく) エラーになります。コンセプトをテストするためにループ (while & foreach w/ preg_match_all) を作成してみました - どちらも無限ループを作成し、私の Web サーバー管理者はあまり満足していません:p

4

1 に答える 1

1

preg_matchimage_url を取得してpreg_replace置き換えるには、次のようにします。

$string = 'I like ducks [image]ducks[/image]';
echo 'Before: ' . $string . '<br />';
$matches = array();
preg_match('/\[image\](.*)\[\/image\]/', $string, $matches);
$image = $matches[1];
//Lookup image_url and throw it in an <img>
$image_url = 'http://blah.com'; //Don't forget <img>
$new_string = preg_replace('/\[image\](.*)\[\/image\]/', $image_url, $string);
echo 'After: ' . $new_string;

編集

$string = "<br />I like ducks [image]ducks[/image]<br />I like cows [image]cows[/image]<br />I like pigs [image]pigs[/image]";
echo 'Before: ' . $string . '<br />';

$matches = array();
preg_match_all('/\[image\]([^\[]*)\[\/image\]/', $string, $matches);
$image_names = $matches[1];
foreach($image_names as $image_name) {
    //Perform your lookup on each name
    //If it is valid perform the replace
    //Gonna say cows isn't there to test
    if($image_name != 'cows') {
        $image_url = 'http://blah.com'; //result of lookup
        $string = preg_replace('/\[image\]' . $image_name . '\[\/image\]/', $image_url, $string);
    }
}
echo 'After: ' . $string;
于 2011-02-08T22:03:35.300 に答える