使 PHPBB 3.0.14 和 ABBC3 与 PHP 7.3 兼容

Make PHPBB 3.0.14 and ABBC3 compatible with PHP 7.3

我正在尝试让 ABBC3 与 PHP 7.3 和 PHPBB 3.0.14 一起工作,因为我无法移动到 PHPBB 3.3,因为 MOD 有很多问题未移植到扩展和主题(赦免)。

我在 PHPBB forum 中寻求帮助,但没有成功,因为不再支持 3.0.x 和 3.1.x 版本。

所以在尝试理解 bbcode 函数的几十个小时之后,我几乎准备好了。

当消息中只有一个 bbcode 时,我的代码可以正常工作。但是当有更多的bbcode或者它与文本混合时不起作用。

所以我想得到一些帮助来解决这部分,使一切正常。

includes/bbcode.php 这个函数的第 98 行:

$message = preg_replace($preg['search'], $preg['replace'], $message);

正在返回这样的东西:

$message = "some text $this->Text_effect_pass('glow', 'red', 'abc') another text. $this->moderator_pass('"fernando"', 'hello!') more text"

对于此消息:

some text [glow=red]abc[/glow] another text.

[mod="fernando"]hello![/mod] more text

上面 preg_replace 的输入是这样的,只是为了上下文:

"some text [glow=red:mkpanc3g]abc[/glow:mkpanc3g] another text. [mod="fernando":mkpanc3g]hello![/mod:mkpanc3g]"

所以基本上我必须将这个字符串拆分成有效的表达式才能应用 eval() 然后连接所有内容。像这样:

$message = "some text". eval($this->Text_effect_pass('glow', 'red', 'abc');) . "another text " . eval($this->moderator_pass('"fernando"', 'hello!');). "more text"

在这种特定情况下,'"fernando"'.

中也有双引号

我知道将 eval() 应用于用户输入是不安全的,所以我想制作某种类型的 preg_match and/or preg_split 获取 () 中的值作为参数传递给我的函数。

功能基本是:

Text_effect_pass()
moderator_pass()
anchor_pass()
simpleTabs_pass()

我在想这样的事情(请忽略这里的错误):

if(preg_match("/$this->Text_effect_pass/", $message)
{
 then split the string and get value inside of() and remove extra single or double quotes.


 after:
 $textEffect = Text_effect_pass($value[0], $value[1], $value[2]);

 Finally concatenate everything:
 $message = $string[0] .$textEffect. $string[1]; 
}
if(preg_match("/$this->moderator_pass/", $message)
{
.....
}

P.S.: 由于使用了 e 修饰符,ABBC3 与 PHP 7.3 不兼容。我已经编辑了所有内容以删除修饰符。

在这里你可以看到它单独工作:

bbcode 1

bbcode 2

有人可以帮我吗?

经过长时间寻找此问题的解决方案后,我发现了这个 site 帮助我构建了正则表达式。

现在我已经设法解决了这个问题,我的论坛可以完全使用 PHPBB 3.14、PHP 7.3 和 ABBC3。

我的解决方案是:

// Start Text_effect_pass
$regex = "/(\$)(this->Text_effect_pass)(\().*?(\')(,)( )(\').*?(\')(,)( )(\').*?(\'\))/is";

if (preg_match_all($regex, $message, $matches)) {
        foreach ($matches[0] as $key => $func) {
                $bracket = preg_split("/(\$)(this->Text_effect_pass)/", $func);
                $param = explode("', '", $bracket[1]);
                $param[0] = substr($param[0], 2);
                $param[2] = substr($param[2], 0, strrpos($param[2], "')"));
                $effect = $this->Text_effect_pass($param[0], $param[1], $param[2]);
                if ($key == 0) {
                        $init = $message;
                } else {
                        $init = $mess;
                }
                $mess = str_replace($matches[0][$key], $effect, $init);
        }
        $message = $mess;
} // End Text_effect_pass

// Start moderator_pass
$regex = "/(\$)(this->moderator_pass)(\().*?(\')(,).*?(\').*?(\'\))/is";

if (preg_match_all($regex, $message, $matches)) {
        foreach ($matches[0] as $key => $func) {
                $bracket = "/(\$)(this->moderator_pass)/";
                $bracket = preg_split($bracket, $func);
                $param = explode("', '", $bracket[1]);
                $param[0] = substr($param[0], 2);
                $param[1] = substr($param[1], 0, strrpos($param[1], "')"));

                $effect = $this->moderator_pass($param[0], $param[1]);
                if ($key == 0) {
                        $init = $message;
                } else {
                        $init = $mess;
                }
                $mess = str_replace($matches[0][$key], $effect, $init);
        }
        $message = $mess;
} // End moderator_pass

有兴趣的可以找补丁文件和说明here

此致。