【问题标题】:BBCode, preg_replace, and named capturing groupsBBCode、preg_replace 和命名捕获组
【发布时间】:2009-06-11 01:17:39
【问题描述】:

我以为两行代码和一个函数的简单实现,结果却失败了。

在我的网页上,我希望能够输入[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'] 失败。

我做错了吗?

我是不是走错路了?

【问题讨论】:

  • 这意味着返回一个 HTML 允许的标签,但是使用 PRE 有点时髦;对于这可能造成的任何混乱,我们深表歉意。

标签: php regex bbcode


【解决方案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> 噪音是什么,所以我假设出于某种原因需要它并不管它。我不知道这是否正确。

【讨论】:

  • (?P<id> 本来是一个命名组,所以它返回为 $regs['id'],这显然不起作用;至于安全问题,我很感激——我已经安装了一个系统来修复它(通过确保只有管理员可以使用 [text]$num[/text]。另一种方法必须是捕获组是(\d+ ?) 而不是 (.*?)。你提到这不是你的处理方式——我很好奇,你会怎么做?
  • 另外,谢谢;这段代码现在可以工作了,虽然我不得不废弃 $res = mysql_result($sql); $row = mysql_fetch_array($res); 所有这些都产生了大量的错误。我对其进行了修改,将 return $row 更改为 $res,但在这种情况下,它只会返回“无效 ID”。
猜你喜欢
  • 1970-01-01
  • 2011-11-29
  • 2013-11-26
  • 2012-04-01
  • 2012-08-24
  • 2014-06-26
  • 2021-02-13
  • 2014-09-11
相关资源
最近更新 更多