Php preg_replace_回调返回与输入相同的值 $post=preg\u replace\u回调(“/\[smartquote]((?:(?!\[smartquote\]))+?)\[\/smartquote\]/s”,函数($match)使用($pdo){ 如果(isset($match[0])){ $returnData=分解(“”,$match[1]); if(empty($returnData[0])| | empty($returnData[1])){ 返回“未找到任何内容”; }否则{ $getPost=$pdo->prepare(“从`posts`中选择*其中`tid`=:topic\u id&`id`=:id”); $getPost->bindValue(':topic_id',$returnData[0]); $getPost->bindValue(':id',$returnData[1]); $getPost->execute(); 如果($getPost->rowCount()==0){ 返回“报价:报价数据”; }否则{ 返回‘某物,某物,黑暗面’; } } } }美元(员额);

Php preg_replace_回调返回与输入相同的值 $post=preg\u replace\u回调(“/\[smartquote]((?:(?!\[smartquote\]))+?)\[\/smartquote\]/s”,函数($match)使用($pdo){ 如果(isset($match[0])){ $returnData=分解(“”,$match[1]); if(empty($returnData[0])| | empty($returnData[1])){ 返回“未找到任何内容”; }否则{ $getPost=$pdo->prepare(“从`posts`中选择*其中`tid`=:topic\u id&`id`=:id”); $getPost->bindValue(':topic_id',$returnData[0]); $getPost->bindValue(':id',$returnData[1]); $getPost->execute(); 如果($getPost->rowCount()==0){ 返回“报价:报价数据”; }否则{ 返回‘某物,某物,黑暗面’; } } } }美元(员额);,php,preg-replace,preg-replace-callback,Php,Preg Replace,Preg Replace Callback,每次我尝试使用它时,我得到的反应就是输入。有人能帮我吗 比如说。如果输入$post='[smartquote]44_12[/smartquote]-它将输出相同的结果。我尝试了您的代码,它似乎按照预期工作,尽管我确实看到您在第一个闭合方括号前错过了一次逃生。我原以为这会让事情变得糟糕,但令我惊讶的是,它居然奏效了 以下是我使用的数据: $post = preg_replace_callback("/\[smartquote]((?:(?!\[smartquote\]).)+?)\[\/smart

每次我尝试使用它时,我得到的反应就是输入。有人能帮我吗


比如说。如果输入
$post='[smartquote]44_12[/smartquote]-它将输出相同的结果。

我尝试了您的代码,它似乎按照预期工作,尽管我确实看到您在第一个闭合方括号前错过了一次逃生。我原以为这会让事情变得糟糕,但令我惊讶的是,它居然奏效了

以下是我使用的数据:

$post = preg_replace_callback("/\[smartquote]((?:(?!\[smartquote\]).)+?)\[\/smartquote\]/s", function($match) use ($pdo){
    if(isset($match[0])){
        $returnData = explode('_',$match[1]);
        if(empty($returnData[0]) || empty($returnData[1])){
            return 'Nothing found';
        } else {
            $getPost = $pdo->prepare("SELECT * FROM `posts` WHERE `tid`=:topic_id && `id`=:id");
                $getPost->bindValue(':topic_id',$returnData[0]);
                $getPost->bindValue(':id',$returnData[1]);
            $getPost->execute();
            if($getPost->rowCount() == 0){
                return '<div class="well"><h5>Quote:</h5><div style="font-size: 12px;">Quote Data</div></div>';
            } else {
                        return 'Something, something, darkside.';   
                }
        }
    }            
},$post);
我获取了您的输入字符串,并稍微修改了您的函数,以确保它实际上是连接到数据库并从数据库中提取数据的。代码如下所示:

CREATE TABLE IF NOT EXISTS `posts` (
  `id` int(9) unsigned NOT NULL AUTO_INCREMENT,
  `tid` int(9) unsigned NOT NULL DEFAULT '0',
  `post_title` varchar(100) NOT NULL,
  `post_data` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `topic_id` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;

INSERT INTO `posts` (`id`, `tid`, `post_title`, `post_data`) VALUES
    (12, 44, 'Nan took it', 'There once was a man from Nantucket who kept all his cash in a bucket.');
那么您应该能够完全省略这一部分:

~(?<=\[smartquote\])(?:(\d+)_(\d+))(?=\[/smartquote\])~s

因为如果未设置
$match[0]
,它根本不会运行该函数。不过,也许您仍想检查
$match[1]
$match[2]
是否包含数据。

也许您弄错了?这是因为我使用PDO来查询数据库吗?我不知道,但我可以帮你调试它。如果您在自己的机器上运行PHP,您应该尝试一个名为xdebug的工具,它允许您跟踪执行并检查任何变量的值,但是现在,请尝试只打印一些值。尝试添加
var\u转储($match)到函数顶部。我对
$match
$returnData
$getPost
进行了变量转储,并且所有变量都存在。它们是否包含预期值?
$returnData
是包含
[44,12]
的数组吗?
<b>Nan took it</b><br><br>There once was a man from Nantucket who kept all his cash in a bucket.
~(?<=\[smartquote\])(?:(\d+)_(\d+))(?=\[/smartquote\])~s
if(isset($match[0])){
    $returnData = explode('_',$match[1]);
        if(empty($returnData[0]) || empty($returnData[1])){
        return 'Nothing found';
} else {