使用转义换行符和回车符取消转义字符串

2024-05-16

我正在尝试编写一个 PLPGSQL 函数来混淆/审查/编辑文本。

-- Obfuscate a body of text by replacing lowercase letters and numbers with # symbols.
CREATE OR REPLACE FUNCTION obfuscate(str text) RETURNS text AS $$
BEGIN
  str := replace(str, '\r', E'\r');
  str := replace(str, '\n', E'\n');
  str := translate(str, 'abcdefghijklmnopqrstuvwxyz0123456789', rpad('#',36,'#'));
  str := replace(str, E'\r', '\r');
  str := replace(str, E'\n', '\n');
  RETURN str;
END
$$ LANGUAGE plpgsql;

这是可行的,但请注意将转义的换行符和回车符转换为各自的字节,然后再返回的舞蹈。这是因为我的数据集包含已转义的字符串(已序列化为 JSON/YAML 的数据),并且我不想破坏这些值。

还有另一种更方便的方法来取消转义字符串吗?处理其他转义值(例如 unicode 转义序列)也很棒。


要“转义”字符串,您必须“执行”它 - 从字面上看。使用EXECUTEplpgsql 中的命令 https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN.
您可以将其包装到一个函数中。天真的方法:

CREATE OR REPLACE FUNCTION f_unescape(text, OUT _t text)
  LANGUAGE plpgsql STABLE AS
$func$
BEGIN
   EXECUTE 'SELECT E''' || $1 || ''''
   INTO _t;
END
$func$;

Call:

SELECT f_unescape('\r\nabcdef\t0123\x123\n');

这个简单的函数是容易受到单引号的影响在原始字符串中,需要转义。但这有点棘手。在 Posix 转义字符串语法中,单引号可以通过两种方式转义:\' or ''。但我们也可以有\\'等。 基础知识:

  • 在 PostgreSQL 中插入带单引号的文本 https://stackoverflow.com/questions/12316953/insert-varchar-with-single-quotes-in-postgresql/12320729#12320729

We could将字符串括在美元引号中,但这不适用于 Posix 转义字符串语法。E'\''不能用 替换E$$\'$$罢工>。我们可以添加SET standard_conforming_strings = off到函数中,那么我们就不必在字符串前面加上E。但这会禁用函数内联和解释函数体内各处都进行转义。

相反,逃避一切'和所有(可选)领先\ with regexp_replace():

regexp_replace($1, '(\\*)(\''+)', '\1\1\2\2', 'g')

(\\*).. 0 个或多个前导\
(\''+)..捕获 1 个或多个'
'\1\1\2\2'..每场比赛加倍
'g'..替换所有出现的情况,而不仅仅是第一个

安全功能

CREATE OR REPLACE FUNCTION f_unescape(IN text, OUT _t text)
  RETURNS text
  LANGUAGE plpgsql STABLE AS
$func$
BEGIN
   EXECUTE $$SELECT E'$$ || regexp_replace($1, '(\\*)(\''+)', '\1\1\2\2', 'g') || $$'$$
   INTO _t;
END
$func$;

操作无法逆转可靠的。无法判断哪个特殊字符之前被转义,哪个没有。你可以逃避一切,也可以逃避一切。或者像以前一样手动进行。但是,如果同一个字符包含在原义形式和转义形式中,您就无法再区分它们。

测试用例:

SELECT t, f_unescape(t)
FROM  (
   VALUES
     ($$'$$)
   , ($$''$$)
   , ($$'''$$)
   , ($$\'$$)
   , ($$\\'$$)
   , ($$\\\'$$)
   , ($$\\\'''$$)
   , ($$\r\\'nabcdef\\\t0123\x123\\\\\'''\n$$)
   ) v(t);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用转义换行符和回车符取消转义字符串 的相关文章

随机推荐

  • Mongodb $push 嵌套数组

    我想向我的嵌套数组添加新数据 我的文档是 username erkin email email protected cdn cgi l email protection password b playlists id 58 name asd
  • 查找列表中项目的索引

    给定一个列表 foo bar baz 和列表中的一个项目 bar 如何获取它的索引1 gt gt gt foo bar baz index bar 1 See 文档 https docs python org tutorial datast
  • WPF 中处理系统关闭

    如何在 WPF 中重写 WndProc 当我的窗口关闭时 我尝试检查我正在使用的文件是否被修改 如果是 我必须提示用户 你想保存更改吗 消息 然后关闭正在使用的文件和窗口 但是 当我的窗口仍然打开时 我无法处理用户重新启动 关闭 注销的情况
  • 如何使用 Swift 将“完成”按钮添加到 iOS 中的数字键盘?

    它在默认键盘上工作得很好 但我无法让它在数字键盘上工作 有任何想法吗 据我所知 你不能在键盘部分添加 完成 按钮 你应该添加一个inputAccessoryView to the UITextField or UITextView 如果这就
  • 样式化组件:如何针对直系儿童?

    我在文档中看到 选择器用于嵌套定位 但以下不起作用 这里使用的正确语法是什么 const InlineContainer styled div display flex gt margin right 40px 作为 CSS 值 字符串 4
  • 使用 UTF-8 编码的 Powershell 字符串变量

    我检查了许多与此相关的问题 但找不到解决我的问题的东西 基本上 我想将 UTF 8 编码的字符串存储在变量中 然后使用该字符串作为文件名 例如 我正在尝试下载 YouTube 视频 如果我们打印视频标题 则会显示非英文字符 ytd这是you
  • docker build --no-cache 是否构建不同的层?

    几个月前 我决定使用以下命令设置我的项目构建 docker 镜像的 CIno cacheflag 我认为最好不要冒险让 docker 使用旧的缓存层 我现在才意识到 我的图像各层的 sha 总是不同的 即使新构建的图像应该生成与之前构建的相
  • MKMapView 拦截/劫持 iPhone 触摸事件

    3 0 SDK 是否存在禁用实时缩放并拦截 MKMapView 放大手势的 bug 我有一些真正简单的代码 因此我可以检测点击事件 但有两个问题 放大手势始终被解释为缩小手势 所有缩放手势都不会实时更新地图视图 在 hitTest 中 如果
  • 限制 Axios 请求

    我正在使用 axios 向 Deezer API 发出请求 不幸的是 使用 Deezer 的 API 当您请求艺术家的专辑时 它不包括专辑曲目 因此 我正在通过请求艺术家的专辑 然后对每个专辑执行后续的 axios 请求来解决这个问题 我遇
  • Android相当于javascript的setTimeout和clearTimeout?

    setTimeout 有一个答案https stackoverflow com a 18381353 433570 https stackoverflow com a 18381353 433570 它没有提供我们是否可以像在 JavaSc
  • 在razor视图引擎中转义@字符

    我正在使用 Razor 作为视图引擎创建一个示例 ASP NET MVC 3 站点 razor 语法开头为 字符例如 RenderBody 如果我在 cshtml 页面上写 test 它会给我解析错误 CS0103 当前上下文中不存在名称
  • Android:拍照后调用裁剪活动

    我在解析拍摄照片的 uri 来裁剪活动时遇到问题 在我的应用程序中 用户可以拍摄一张照片或从图库中选择一张照片 然后裁剪并上传 一切听起来都很简单 从图库中选择时 图库应用程序会返回所选照片的 uri 如下所示 content media
  • 测量两个字符串之间相似性的有效方法是什么? (编辑距离使堆栈太深)

    所以 我从这个开始 http en wikibooks org wiki Algorithm Implementation Strings Levenshtein distance Ruby http en wikibooks org wi
  • 在新的 iTunes Connect 中更改主要语言

    Apple 最近发布了新版本的 iTunes Connect 我只想更改应用程序的主要语言 但是文档 https developer apple com library ios documentation LanguagesUtilitie
  • C#:shlwapi.dll 中 StrCmpLogicalW 的实现或替代

    为了在我的应用程序中进行自然排序 我当前在 shlwapi dll 中 P Invoke 一个名为 StrCmpLogicalW 的函数 我正在考虑尝试在 Mono 下运行我的应用程序 但当然我不能拥有这个 P Invoke 东西 据我所知
  • 如何使用表内的 JSONB 数据类型和 PostgreSQL JDBC 驱动程序将 JSON 对象存储到 PostgreSQL 中

    我想将以下 json 对象保存到 PostgreSQL 数据库表中as jsonb fname john lname doe 我当前使用 PGObject 创建对象并将类型设置为 jsonb 并将值作为 json 字符串传递 寻找更好的 m
  • 无法找到/下载 AppCompat-v7:23.1.1

    怎么了 我遇到了很多 找不到 appcompat v7 23 1 1 的问题 许多解决方案都不起作用 经过几个小时的思考和寻找答案 我遇到了一个奇怪的问题 I have gotAndroid 支持库 23 1 1 已安装 所有功能 exce
  • 动态创建类 - Python

    我需要动态创建一个类 为了更详细地讲 我需要动态创建 Django 的子类Form class 通过 动态 我打算根据用户提供的配置创建一个类 e g 我想要一个名为CommentForm这应该子类化Form class 该类应该有一个选定
  • 让 gradle 执行 JUnit 测试(Android 应用程序、Android Studio)

    我目前正在开发一个 Android 应用程序 最近从 Eclipse 切换到 Android Studio 不是我的想法 不过 我想配置 jenkins 服务器来定期运行 JUnit 测试和其他测试 为了实现这一点 我尝试配置一个 grad
  • 使用转义换行符和回车符取消转义字符串

    我正在尝试编写一个 PLPGSQL 函数来混淆 审查 编辑文本 Obfuscate a body of text by replacing lowercase letters and numbers with symbols CREATE