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”。