c# - 需要帮助将包含空格的 bbcode URL 转换为有效的降价
问题描述
作为一些数据迁移的一部分,我将用户内容从 bbcode 转换为 markdown。
我正在自定义 MySQL 8.0.22 函数中进行转换,该函数包含以下将 bbcode[url]
标记转换为 markdown 的行:
...
SET markdown = REGEXP_REPLACE(markdown, '\\[url=([^\\]]+)\\](.*?)\\[\\/url\\]', '[$2]($1)', 1, 0, 'i');
...
这按预期执行,例如:
[url=https://stackoverflow.com/]SO[/url]
正确转换为[SO](https://stackoverflow.com/)
问题是:一些 URL 包含空格,这不是有效的降价并且在我的客户端上没有正确显示。
是否可以修改我的REGEXP_REPLACE
语句以用“%20”替换链接中的空格?
如果可能的话,我想在 MySQL 中完成这一切,但如果需要,可以在 C# 中对每条记录进行处理。
为了完整起见,我的整个 bbcode 到 markdown 函数是:
CREATE DEFINER=`root`@`localhost` FUNCTION `func_bb_to_md`(bbcode MEDIUMTEXT) RETURNS mediumtext CHARSET utf8mb4
DETERMINISTIC
BEGIN
DECLARE markdown MEDIUMTEXT;
SET markdown = bbcode;
SET markdown = REGEXP_REPLACE(markdown, '\\[code\\](.*?)\\[\\/code\\]', '`$1`', 1, 0, 'i');
SET markdown = REGEXP_REPLACE(markdown, '\\[url\\](.*?)\\[\\/url\\]', '<$1>', 1, 0, 'i');
SET markdown = REGEXP_REPLACE(markdown, '\\[url=([^\\]]+)\\](.*?)\\[\\/url\\]', '[$2]($1)', 1, 0, 'i');
SET markdown = REGEXP_REPLACE(markdown, '\\[img\\](.*?)\\[\\/img\\]', '![]($1)', 1, 0, 'i');
SET markdown = REGEXP_REPLACE(markdown, '\\[yt\\](.*?)\\[\\/yt\\]', '![]($1)', 1, 0, 'i');
SET markdown = REGEXP_REPLACE(markdown, '\\[b\\](.*?)\\[\\/b\\]', '**$1**', 1, 0, 'i');
SET markdown = REGEXP_REPLACE(markdown, '\\[i\\](.*?)\\[\\/i\\]', '*$1*', 1, 0, 'i');
SET markdown = REGEXP_REPLACE(markdown, '\\[u\\](.*?)\\[\\/u\\]', '$1', 1, 0, 'i');
SET markdown = REPLACE(markdown, '[list]', '');
SET markdown = REPLACE(markdown, '[list=1]', '');
SET markdown = REPLACE(markdown, '[/list]', '');
SET markdown = REPLACE(markdown, '[*]', '* ');
SET markdown = REGEXP_REPLACE(markdown, '\\[color=([^\\]]+)\\](.*?)\\[\\/color\\]', '$2', 1, 0, 'i');
SET markdown = REGEXP_REPLACE(markdown, '\\[quote\\](.*?)\\[\\/quote\\]', '> $1', 1, 0, 'i');
SET markdown = REPLACE(markdown, ':)', '{{slightly_smiling_face}}');
SET markdown = REPLACE(markdown, ';)', '{{wink}}');
SET markdown = REPLACE(markdown, ':D', '{{grin}}');
SET markdown = REPLACE(markdown, ':P', '{{stuck_out_tongue}}');
SET markdown = REPLACE(markdown, ':(', '{{frowning_face}}');
SET markdown = REPLACE(markdown, ':''(', '{{cry}}');
SET markdown = REPLACE(markdown, ':.', '{{flushed}}');
SET markdown = REPLACE(markdown, ':|', '{{neutral_face}}');
SET markdown = REPLACE(markdown, ':O', '{{open_mouth}}');
SET markdown = REPLACE(markdown, ':@', '{{angry}}');
SET markdown = REPLACE(markdown, ':S', '{{confused}}');
SET markdown = REPLACE(markdown, ':$', '{{blush}}');
SET markdown = REGEXP_REPLACE(markdown, '\\{\\{(.*?)\\}\\}', ':$1:', 1, 0, 'i');
SET markdown = REPLACE(markdown, '\r\n', '\n');
SET markdown = REPLACE(markdown, '\n', '\r\n');
RETURN markdown;
END
解决方案
在 C# 中,您可以使用Regex.Replace
匹配评估器来操作捕获的文本。在 MySQLREGEXP_REPLACE
中,您没有此选项。
所以,你可以使用
var markdown = "[url=https://stackoverflow.com/a b]SO[/url]";
var p = @"(?i)\[url=([^]]+)](.*?)\[/url]";
var result = Regex.Replace(markdown, p, x =>
$"[{x.Groups[2].Value}]({x.Groups[1].Value.Replace(" ","%20")})");
Console.WriteLine(result);
在线查看此 C# 演示。
正(?i)\[url=([^]]+)](.*?)\[/url]
则表达式匹配(以不区分大小写的方式) ,捕获除第 1 组[url=
之外的任何一个或多个字符,然后捕获子字符串。匹配被传递给匹配评估器,是一个匹配对象。进行所有必要的操作。]
[/url]
x
$"[{x.Groups[2].Value}]({x.Groups[1].Value.Replace(" ","%20")})")
推荐阅读
- python - 如何将创建新选项卡与编辑配对
- python - 连接已创建轮廓的末端
- html - 如何在 Vue.js 中导航到不同的 .html 页面
- asp.net-mvc-5 - 如何在 mvc5 中删除特定上传的文件?
- python - 如何将数据插入现有数据框中,根据条件替换值
- python - 无法使用 python 程序将文本文件数据传输到 arduino
- javascript - 为什么我的 react-bootstrap 行在移动设备上重叠?
- regex - 如果字符串中的多个选项中只有一个匹配项,则正则表达式匹配
- android - Android 调试数据库无法访问站点
- swift - 如何在 SwiftUI 中使用 Google Mobile Ads SDK,或在 SwiftUI 视图中使用 UIKit UIViewController?