2009-06-11 8 views
1

私は、2行のコードと関数を簡単に実装しようとしていると思っていましたが、これは失敗であることが判明しました。BBCode、preg_replace、および名前付きキャプチャグループ

私のウェブページでは、[text]1[/text]と入力できます。そのIDのタイトルをプルすることができます。

function textFormat($text) { 
    $raw = array(
     '\'\[text\](?P<id>.*?)\[/text\]\'is' 
    ); 

    $out = array (
     '<a href="index.php?function=getData&reference=text&id=$1">' . getTextTitle() . '</a>' 
    ); 

    preg_replace($raw, $out, $text); 
    return $text; 
} 

function getTextTitle($id) { 
    $sql = mysql_query("SELECT title FROM text WHERE id = $id"); 
    return mysql_result($sql); 
} 

だから、ここ美しい小さな問題があります:1が言うことができるように、私は引用符で素晴らしい作品数値というタイトルの変数と関数を呼び出すんだけど、私たちが知っているように、PHPにはありませんそうですね。だから、名前のついたグループを選んだ。 $regs['id']を使用すると動作しません。

何か間違っていますか?

私はこれについて間違った方法をしていますか?

+0

これは、HTMLで許されるようにタグを返すことを意図していますが、PREを使用するとこれに少し不安があります。これが原因で起こり得る混乱をおかけして申し訳ありません。 –

答えて

1

さて、あなたは確かに私とは根本的に違う方法でやっていますが、あなたが試みていることから離れすぎていないとは思えません。これを試してみてください:

function textFormat($text) { 
    $raw = array(
     '\'\[text\](?P<id>.*?)\[/text\]\'ise' 
    ); 
    $out = array (
     '\'<a href="index.php?function=getData&reference=text&id=$1">\' . getTextTitle(\'$1\') . \'</a>\'' 
    ); 
    preg_replace($raw, $out, $text); 
    return $text; 
} 

function getTextTitle($id) { 
    $sql = mysql_query("SELECT title FROM text WHERE id = '" . mysql_real_escape_string($id) . "'"); 
    $res = mysql_result($sql); 
    $row = mysql_fetch_array($res); 
    return $row ? $row[0] : 'invalid ID'; 
} 

あなたの元getTextTitle()だろう、何か他のものが私に起こっている場合を除きを認識していないよ、ところで、誰もが、彼らがSQLインジェクションを経由してデータベースに気に入ったものをやらせます。どういたしまして。

また、私はそのことについてはわかりません(?P<id>ノイズは正規表現内にあるので、何らかの理由でそれが必要であると仮定し、それを残しておきます。これが正しいかどうかわかりません。

+0

(?P <id>は名前付きグループを意味していたので、$ regs ['id']として返されますが、これは明らかに機能しません;セキュリティ問題に関しては、私はそれを感謝します。管理者だけが$ num [/ text]を使用できるようにすることで、すでにそれを修正するシステムを導入しています。(*。*)の代わりにキャプチャグループを(\ d +?)あなたがそれに近づく方法ではないことに言及しました - 私は好奇心です、どうでしょうか? –

+0

さらに、ありがとうございます;このコードは今では機能していますが、私はスクラップをしました$res = mysql_result($sql); $row = mysql_fetch_array($res);多量のエラーが発生していました。私はreturn $rowを$ resと変更しましたが、そのインスタンスでは「無効なID」が返されます。 –

関連する問題