我正在围绕PHP bbcode
PECL扩展程序编写CodeIgniter库,但我在回调时遇到了一些问题。
我在库构造函数中设置了处理程序:
function __construct() {
$basic = array(
'url' => array(
'type' => BBCODE_TYPE_OPTARG,
'open_tag' => '<a href="{PARAM}" rel="nofollow">',
'close_tag' => '</a>',
'childs'=>'i,b,u,strike,center,img',
'param_handling' => array($this, 'url')
)
);
$this->handler = bbcode_create($basic);
}
public function parse($bbcode_string) {
return bbcode_parse($this->handler, htmlentities($bbcode_string));
}
正如您所注意到的,它使用回调来处理允许进入URL的内容。我用它来插入&#34;退出重定向&#34;页
public static function url($content, $argument) {
if (!$argument) $argument = $content;
$url = parse_url($argument);
if (!isset($url['host'])) {
if (strlen($argument) > 0 && $argument[0] != '/') return false;
$destination = '//'.$_SERVER['HTTP_HOST'].$argument;
} elseif ($url['host'] != $_SERVER['HTTP_HOST']) {
$destination = '//'.$_SERVER['HTTP_HOST'].'/exit?'.urlencode($argument);
} else {
$destination = $argument;
}
return htmlspecialchars($destination);
}
我还有一个小功能可以帮助我在工作时测试它:
function test() {
$string = '[url]http://www.google.com[/url]';
echo '<pre>';
die($this->parse($string));
}
如果从库中调用test()
方法,这一切都可以正常。例如,如果我在构造函数的底部抛出$this->test()
,那么一切都与我期望的完全一样。但是,从其他地方(例如在控制器中)调用$this->bbcode->test()
,我会收到以下错误:
**A PHP Error was encountered**
Severity: Warning
Message: Invalid callback , no array or string given
Filename: libraries/bbcode.php
Line Number: 122
**A PHP Error was encountered**
Severity: Warning
Message: bbcode_parse(): function `' is not callable
Filename: libraries/bbcode.php
Line Number: 122
<a href="" rel="nofollow">http://www.google.com</a>
回调未执行,因此链接的href
属性为空。第122行引用我的parse
函数中的单行代码:
return bbcode_parse($this->handler, htmlentities($bbcode_string));
如何解决此回调函数,以便在从控制器内部调用$this->bbcode->test()
时找到它?
现在我更加困惑......
因此,希望将这一切都放在我身后,我将这些回调函数放在帮手中,这样我就可以直接调用它们了。所以我现在有这样的代码:
function __construct() {
$basic = array(
'url' => array(
'type' => BBCODE_TYPE_OPTARG,
'open_tag' => '<a href="{PARAM}" rel="nofollow">',
'close_tag' => '</a>',
'childs'=>'i,b,u,strike,center,img',
'param_handling' => 'bbcode_url'
)
);
$this->handler = bbcode_create($basic);
}
有了上述内容,我收到以下错误:
**A PHP Error was encountered**
Severity: Warning
Message: Invalid callback 6.7949295043945E-5, no array or string given
Filename: libraries/bbcode.php
Line Number: 176
**A PHP Error was encountered**
Severity: Warning
Message: bbcode_parse(): function `6.7949295043945E-5' is not callable
Filename: libraries/bbcode.php
Line Number: 176
(第176行是parse()
函数的新位置)
6.7949295043945E-5
个数字。
答案 0 :(得分:0)
我发现的唯一解决办法就是不要在构造函数中设置处理程序。相反,parse()
方法包含 bbcode_create()
调用和bbcode_parse()
调用。也就是说,为每个要解析的bbcode字符串新创建bbcode_handler
。
这对我来说似乎是不必要的浪费。但是,在这个项目的整个生命周期中,我极不可能花费甚至十分之一的时间来试图解决这个问题&#34;正确&#34;所以我是称之为一天。
我发布了这个&#34;解决方案&#34;这是为了防止其他人遇到这个问题,从而可以节省几个小时的时间。痛。也就是说,我真的想知道到底发生了什么,以及如何正确地做到这一点。