Php BBCode、preg_replace和命名捕获组

Php BBCode、preg_replace和命名捕获组,php,regex,bbcode,Php,Regex,Bbcode,我原以为可以简单地实现两行代码和一个函数,但结果却是失败了 在我的网页上,我希望能够键入[text]1[/text],它将做的是提取该ID的标题 function textFormat($text) { $raw = array( '\'\[text\](?P<id>.*?)\[/text\]\'is' ); $out = array ( '<a href="index.php?function=

我原以为可以简单地实现两行代码和一个函数,但结果却是失败了

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

我做错什么了吗


我是不是走错了路?

好吧,你肯定是在用一种与我完全不同的方式来做这件事,但我认为一些离你尝试的不太远的事情可能会奏效。试试这个:

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注入对您的数据库执行任何他们喜欢的操作,除非发生了我不知道的其他事情。不客气


而且,我不知道那是什么
(?Pid
noise是关于正则表达式的,所以我假设出于某种原因需要它,不去管它。我不知道这是否正确。

好吧,你肯定是以一种与我完全不同的方式来做的,但我认为与你尝试的方式不太远的东西可能会起作用。试试这个:

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注入对您的数据库执行任何他们喜欢的操作,除非发生了我不知道的其他事情。顺便说一句,不客气


而且,我不知道那是什么
(?Pid
noise是关于正则表达式的,所以我假设出于某种原因需要它,不去管它。我不知道这是否正确。

它的意思是按照HTML允许的方式返回标记,但在这方面使用PRE有点奇怪;很抱歉,这可能会造成任何混乱。它的意思是按照HTML允许的方式返回标记,但使用PRE在这个问题上有点古怪;很抱歉这可能会引起任何混乱。这个(?Pid应该是一个命名组,所以它返回$regs['id',],这显然不起作用;至于安全问题,我很感激——我已经安装了一个修复系统(通过确保只有管理员才能使用[text]$num[/text]。另一种方法是捕获组必须是(\d+?)而不是(.*)。您提到这不是您的方法--我很好奇,您会怎么做?此外,谢谢您;这段代码现在正在工作,尽管我不得不放弃
$res=mysql\u result($sql);$row=mysql\u fetch\u array($res)
所有这些都产生了大量错误。我对其进行了修补,将
return$row
改为$res,但在这种情况下,它只会返回“invalid ID”。(-Pid是一个命名组,因此它将以$regs['ID'的形式返回),这显然不起作用;至于安全问题,我很感激——我已经安装了一个修复系统(通过确保只有管理员才能使用[text]$num[/text]。另一种方法是捕获组必须是(\d+?)而不是(.*).您提到这不是您的做法--我很好奇,您会怎么做?此外,谢谢您;虽然我不得不放弃
$res=mysql\u result($sql);$row=mysql\u fetch\u array($res),但这段代码现在正在运行
所有这些都产生了大量错误。我对其进行了修补,将
return$row
改为$res,但在这种情况下,它只会返回“invalid ID”。