使用 s9e\TextFormatter 的未定义变量 $parser

Posted

技术标签:

【中文标题】使用 s9e\\TextFormatter 的未定义变量 $parser【英文标题】:undefined variable $parser using s9e\TextFormatter使用 s9e\TextFormatter 的未定义变量 $parser 【发布时间】:2017-04-11 15:38:09 【问题描述】:

编辑:这不是关于未定义变量的一般问题,而是关于这个特定的代码示例,它在没有指定从哪里提取变量的情况下。

我正在尝试使用 s9e\TextFormatter 设置标签的 html 白名单,如 here 所记录的那样。

这是我的代码:

use s9e\TextFormatter\Configurator;

function htmlFormat( )

    $configurator = new Configurator;
    $configurator->plugins->load( 'HTMLElements' );

    $configurator->HTMLElements->allowElement( 'b' );
    $configurator->HTMLElements->allowAttribute( 'b', 'class' );
    $configurator->HTMLElements->allowElement( 'i' );

    // Get an instance of the parser and the renderer
    extract( $configurator->finalize() );

    $text = '<b>Bold</b> and <i>italic</i> are allowed, but only <b class="important">bold</b> can use the "class" attribute, not <i class="important">italic</i>.';
    $xml = $parser->parse( $text );
    $html = $renderer->render( $xml );


htmlFormat();

但是,变量 $parser$renderer 从未在该示例代码中定义。我不知道如何将它们集成到这段代码中,是吗?

【问题讨论】:

$parser & $renderer 可以是任何东西。或许查看你复制它的代码以了解这些变量的真正含义。 php: "Notice: Undefined variable", "Notice: Undefined index", and "Notice: Undefined offset"的可能重复 这不是关于未定义变量的一般问题,而是关于这个特定脚本的问题。 查看this example $parser 显然是由第59 行对extract() 的调用定义的 您是否在 IDE/输出中看到错误或只是注意到它们未定义? 【参考方案1】:

这一行

extract( $configurator->finalize() );

定义这些变量。这是因为extract() 将“将变量从数组导入当前符号表1(参考the PHP documentation example 可能有助于理解这一点)。查看Configurator::finalize()的文档块:

/**
* Finalize this configuration and return all the relevant objects
*
* Options: (also see addHTMLRules() options)
*
*  - addHTML5Rules:    whether to call addHTML5Rules()
*  - finalizeParser:   callback executed after the parser is created (gets the parser as arg)
*  - finalizeRenderer: same with the renderer
*  - optimizeConfig:   whether to optimize the parser's config using references
*  - returnParser:     whether to return an instance of Parser in the "parser" key
*  - returnRenderer:   whether to return an instance of Renderer in the "renderer" key
*
* @param  array $options
* @return array One "parser" element and one "renderer" element unless specified otherwise
*/

2

最后两个选项(returnParserreturnRenderer)默认为 true。

尝试运行这些行(在配置 Configurator 实例之后):

extract( $configurator->finalize() );
echo 'typeof $parser: '.get_class($parser).'<br>';
echo 'typeof $renderer: '.get_class($renderer).'<br>';

这应该产生以下文本:

$parser 的类型:s9e\TextFormatter\Parser

$renderer 类型:s9e\TextFormatter\Renderers\XSLT


1http://php.net/extract

2https://github.com/s9e/TextFormatter/blob/master/src/Configurator.php#L223

【讨论】:

以上是关于使用 s9e\TextFormatter 的未定义变量 $parser的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery DataTable 的未定义值

使用 bjam 编译的来自 C++ 的未定义符号

使用 CMake 的自定义 .h 和 cpp 的未定义符号 [关闭]

nil:NilClass 的未定义方法“每个”,但我使用了实例变量

对 `_imp__SetupDiGetClassDevsA@16' 的未定义引用(即使使用 -lsetupapi)

对静态成员的未定义引用