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 {