BBCode,preg_replace和命名捕获组

时间:2009-06-11 01:17:39

标签: php regex bbcode

我认为这将简单地实现两行代码和一个函数,结果证明是失败的。

在我的网页上,我希望能够输入[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);
}

所以,这是一个可爱的小问题:正如人们所知,我正在调用一个带有数字标题变量的函数,它在引号中工作得很好,但正如我们所知,PHP并不喜欢这样。所以,我选择了一个命名组。使用$regs['id']无效。

我做错了吗?

我是以错误的方式解决这个问题吗?

1 个答案:

答案 0 :(得分: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>噪音的含义是什么,所以我假设出于某种原因需要它并且不管它。我不知道这是否正确。