无法匹配或替换recursiveTagParse返回字符串

时间:2014-01-06 00:45:42

标签: php mediawiki mediawiki-extensions

我正在制作一个嵌套的标记扩展,其中父标记(在我的情况下为<tabs>)需要能够影响子标记的内容(在我的情况下<tab> )。我尝试通过运行$parser->recursiveTagParse($input)来实现这一点,其中$input<tabs>标记的内容,但在返回的字符串中,似乎无法匹配任何内容。为了以最基本的方式对此进行测试,我做了以下工作:

添加到LocalSettings.php:

require_once "$IP\\extensions\\Test\\Test.php";

使用以下命令在Test目录中创建Test.php:

<?php
$wgAutoloadClasses['Test'] = __DIR__ . '/Test.body.php';
$wgHooks['ParserFirstCallInit'][] = 'Test::init';

使用以下命令创建Test.body.php:

<?php
class Test {
    public static function init( &$parser ) {
        $parser->setHook( 'testfoo', array( 'Test', 'firstTag' ) );
        $parser->setHook( 'testbar', array( 'Test', 'secondTag' ) );
        return true;
    }

    public static function firstTag($input, $attr = array(), $parser, $frame) {
        $newinput = $parser->recursiveTagParse($input);
        return preg_match_all("/ /", $newinput);
    }

    public static function secondTag($input, $attr = array(), $parser, $frame) {
        return htmlspecialchars($input);
    }
}

最后,将以下内容放在wiki的页面上:

<testfoo>three spaces out here<testbar>and four more spaces here</testbar></testfoo>

这应该使最终输出为7,因为输出字符串中有7个空格。问题是,这会返回3,即<testbar>标记之外的空格数量。

我想知道的是,是否有可能匹配和/或替换解析嵌套标记的结果(所以嵌套标记输出的是什么),如果是不可能,嵌套在<testbar>标记内时,<testfoo>标记是否可能有不同的行为?


我还尝试在PPFrame部分添加$parser->recursiveTagParse($input)作为第二个参数,以尝试检测嵌套,但PPFrame的文档很不清楚,我不知道是什么我需要去做。基于what the documentation says,我现在所做的是:

    public static function firstTag($input, $attr = array(), $parser, $frame) {
        $newframe = $frame->newChild(array('nested'=>'true'), $frame->getTitle(), 0);
        $newinput = $parser->recursiveTagParse($input, $newframe);
        return preg_match_all("/ /", $newinput);
    }

但这会导致错误。当我这样做时它说的是:

  

注意:尝试在第984行的C:\ hiddenpath \ w \ includes \ parser \ Preprocessor_DOM.php中获取非对象的属性

     

捕获致命错误:传递给DOMXPath :: __ construct()的参数1必须是DOMDocument的一个实例,给定null,在第10行的C:\ hiddenpath \ w \ extensions \ Test \ Test.body.php中调用并定义在第984行的C:\ hiddenpath \ w \ includes \ parser \ Preprocessor_DOM.php

但我不知道我需要做些什么来解决这个问题。我需要将我的第一个参数作为特殊对象吗?如果是这样,为什么文档说我需要将数组作为第一个参数?

1 个答案:

答案 0 :(得分:1)

自己回答这个问题,因为没有其他答案

我设法得到我想要的结果的方法是放弃问题的原始第一部分:“我想知道的是,是否有可能匹配和/或替换解析嵌套标记的结果(所以嵌套标记输出的内容)“只是移动到第二部分,”如果不可能,是否有可能使标记行为不同嵌套在标签内“。

我这样做的方法是在类中定义一个变量,然后改变一下我是否对a的内容做了recursiveTagParse。 Test.php中的代码将是:

    public static function init( &$parser ) {
        $parser->setHook( 'testfoo', array( new self(), 'firstTag' ) );
        $parser->setHook( 'testbar', array( new self(), 'secondTag' ) );
        return true;
    }

    function firstTag($input, $attr = array(), $parser, $frame) {
        $this::$nested = true;
        $newinput = $parser->recursiveTagParse($input);
        $this::$nested = false;
        return preg_match_all("/ /", $newinput);
    }

    function secondTag($input, $attr = array(), $parser, $frame) {
        if ($this::$nested) {
            $output = 'Display for when nested'.$input;
        } else {
            $output = 'Display for when not nested'.$input;
        }
        return htmlspecialchars($output);
    }
}

这样,当我在<testbar>标记内时,我仍然可以使<testfoo>标记的行为有所不同。我不确定这是否应该如此完成,但它确实有效。

PS:我也忽略了$frame->newChild()代码,因为这似乎不起作用,也没有明确的文档或示例。