使用修饰符 /e 将 preg_replace 函数从 php 5 迁移到 php 7
Migrating preg_replace function from php 5 to php 7 using modifier /e
所以我有 php 为 php 5.6 编写的函数。我认为 this 最初是我放在一起时的来源。我做了一些改变。这是我最终得到的代码:
function Format($input){
//escape input
$search = array(
'/\[b\](.*?)\[\/b]/is',
'/\[i\](.*?)\[\/i]/is',
'/\[u\](.*?)\[\/u]/is',
'/\[s\](.*?)\[\/s]/is',
'/\[img\](.*?)\[\/img\]/is',
'/\[color=(.*?)\](.*?)\[\/color\]/is',
'/\[quote=(.*?)\]/e',
'/\[p\](.*?)\[\/p]/is',
);
$replace = array(
'<b></b>',
'<i></i>',
'<u></u>',
'<s></s>',
'<img src="">',
'<font style="color:;"></font>',
'GenerateQuote()',
'<a style="color:#ff6600" href=https://' . $_SERVER['SERVER_NAME'] .'/(...)/></a>'
);
return preg_replace($search, $replace, $input);
}
function GenerateQuote($commentID){
$sqlresult = mysqli_query($db, "(...)");
(...)
return $QuoteCode;
}
该函数用于将一段文字中的BB标签转换为对应的HTML标签。
quote 标签使用了一个在 PHP 7.
中不再支持的 /e 参数
preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
有人可以帮助我将这段代码从 PHP 5.6 迁移到 PHP 7 吗?我不知道该怎么做。
您的大部分表达式不包含 e 修饰符,因此它们可以保持原样。但是你需要拆分数组,并分别处理 eval 表达式。
删除 search
和 replace
的最后两行。那么:
$tmp = preg_replace($search, $replace, $input);
应用前六个替换项。然后用preg_replace_callback去掉e修饰符:
$tmp = preg_replace_callback('/\[quote=(.*?)\]/',
function ($m) { return GenerateQuote($m[1]); },
$tmp);
最后一部分又是一个简单的替换(从你的问题中复制粘贴)。
return preg_replace('/\[p\](.*?)\[\/p]/is',
'<a style="color:#ff6600" href=https://' . $_SERVER['SERVER_NAME'] .'/(...)/></a>',
$tmp);
应该可以,但是如果您只在那个地方使用 GenerateQuote
,您可以重写函数以接受一个数组并将其直接用作回调。
所以我有 php 为 php 5.6 编写的函数。我认为 this 最初是我放在一起时的来源。我做了一些改变。这是我最终得到的代码:
function Format($input){
//escape input
$search = array(
'/\[b\](.*?)\[\/b]/is',
'/\[i\](.*?)\[\/i]/is',
'/\[u\](.*?)\[\/u]/is',
'/\[s\](.*?)\[\/s]/is',
'/\[img\](.*?)\[\/img\]/is',
'/\[color=(.*?)\](.*?)\[\/color\]/is',
'/\[quote=(.*?)\]/e',
'/\[p\](.*?)\[\/p]/is',
);
$replace = array(
'<b></b>',
'<i></i>',
'<u></u>',
'<s></s>',
'<img src="">',
'<font style="color:;"></font>',
'GenerateQuote()',
'<a style="color:#ff6600" href=https://' . $_SERVER['SERVER_NAME'] .'/(...)/></a>'
);
return preg_replace($search, $replace, $input);
}
function GenerateQuote($commentID){
$sqlresult = mysqli_query($db, "(...)");
(...)
return $QuoteCode;
}
该函数用于将一段文字中的BB标签转换为对应的HTML标签。 quote 标签使用了一个在 PHP 7.
中不再支持的 /e 参数preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
有人可以帮助我将这段代码从 PHP 5.6 迁移到 PHP 7 吗?我不知道该怎么做。
您的大部分表达式不包含 e 修饰符,因此它们可以保持原样。但是你需要拆分数组,并分别处理 eval 表达式。
删除 search
和 replace
的最后两行。那么:
$tmp = preg_replace($search, $replace, $input);
应用前六个替换项。然后用preg_replace_callback去掉e修饰符:
$tmp = preg_replace_callback('/\[quote=(.*?)\]/',
function ($m) { return GenerateQuote($m[1]); },
$tmp);
最后一部分又是一个简单的替换(从你的问题中复制粘贴)。
return preg_replace('/\[p\](.*?)\[\/p]/is',
'<a style="color:#ff6600" href=https://' . $_SERVER['SERVER_NAME'] .'/(...)/></a>',
$tmp);
应该可以,但是如果您只在那个地方使用 GenerateQuote
,您可以重写函数以接受一个数组并将其直接用作回调。