使 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。
此致。
我正在尝试让 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。
此致。