HTML Purifier和spl_autoload_register

问题描述 投票:0回答:1

我的页面的文件夹

system/ <-- offline files (classes, cronjobs, libraries ...)
online/ <-- contain all php scripts ( available online )

system/

classes <-- all my own classes inside.
... directories ...
libraries/htmlpurifier <- contain HTMLPurifier

我想用spl_autoload_register()

<?php

define("DOC_ROOT", dirname(__DIR__));

function hTMLPurifier($class) {
 require DOC_ROOT . '/system/libraries/htmlpurifier/library/' . strtolower(str_replace('\\', '/', $class)) . '.php';
 }

 function myAutoload($class) {
 require DOC_ROOT . '/' . strtolower(str_replace('\\', '/', $class)) . '.php';
 }

spl_autoload_register('hTMLPurifier');
spl_autoload_register('myAutoload');


$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
?>

我收到了关注消息。

 .../htmlpurifier_config.php): failed to open stream: No such file or directory in ...

如果插入

  "require_once '/path/to/HTMLPurifier.auto.php';"

在上面

<?php

define("DOC_ROOT", dirname(__DIR__));
require_once '/path/to/HTMLPurifier.auto.php';

function myAutoload($class) {
  require DOC_ROOT . '/' . strtolower(str_replace('\\', '/', $class)) . '.php';
 }


 spl_autoload_register('myAutoload');


 $config = HTMLPurifier_Config::createDefault();
 $purifier = new HTMLPurifier($config);
 $clean_html = $purifier->purify($dirty_html);
 ?>

一切都很有效。

我想只使用spl_autoload_register()加载所有类而不插入

"require_once '/path/to/HTMLPurifier.auto.php';" 

在上面。我该怎么做???

php htmlpurifier
1个回答
0
投票

HTML Purifier不适用于PHP命名空间,因此用\\替换/不会使您获得的结果成为可能。您的自动加载逻辑正在尝试从文件HTMLPurifier_Config加载类htmlpurifier_config.php - 所以你想要的是这样的:

function autoloadHtmlPurifier($class) {
    require DOC_ROOT . '/system/libraries/htmlpurifier/library/'
        . str_replace('_', '/', $class) . '.php';
}
spl_autoload_register('autoloadHtmlPurifier');

(注意这个函数如何不使用strtolower()并用_替换/。)

但是,看看the HTML Purifier autoload implementation

public static function getPath($class)
{
    if (strncmp('HTMLPurifier', $class, 12) !== 0) {
        return false;
    }
    // Custom implementations
    if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) {
        $code = str_replace('_', '-', substr($class, 22));
        $file = 'HTMLPurifier/Language/classes/' . $code . '.php';
    } else {
        $file = str_replace('_', '/', $class) . '.php';
    }
    if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) {
        return false;
    }
    return $file;
 }

...由于语言类边缘情况,简单替换仍然无法正常运行。但你可以试试这个:

function autoloadHtmlPurifier($class) {
    require DOC_ROOT . '/system/libraries/htmlpurifier/library/'
        . str_replace('_', '/', $class) . '.php';
}
spl_autoload_register('autoloadHtmlPurifier');
spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload'));

这使用您的自定义自动加载器来加载HTMLPurifier_Bootstrap类,因此您不需要将它包含在require中,但仍然可以使用规范的自动加载器进行HTML Purifier。

谨慎

也就是说,在任何一种情况下,缺点是如果HTML Purifier确实切换到命名空间,那么它的自动加载器将会中断。我真的建议你坚持使用require_once(DOC_ROOT . '/system/libraries/htmlpurifier/library/HTMLPurifier.auto.php')方法,或使用composer安装HTML Purifier,这将take care of autoloading that library (and possibly others) for you

对于指定自动加载信息的库,Composer会生成vendor / autoload.php文件。您可以简单地包含此文件并开始使用这些库提供的类,而无需任何额外的工作:

require __DIR__ . '/vendor/autoload.php';
© www.soinside.com 2019 - 2024. All rights reserved.