如何在不使用 gsub 的情况下转义“

Posted

技术标签:

【中文标题】如何在不使用 gsub 的情况下转义“【英文标题】:How to escape " without using gsub 【发布时间】:2020-11-20 22:05:17 【问题描述】:
x = JSON.parse(meta[:phone_number])

output = ""(982) xxx-xxxx"]"

我只想要电话号码。

我可以做到JSON.parse(meta[:phone_number]).gsub('"', '"')

这很好用,但它与我们拥有的每个版本都不兼容。

我想要一种在任何地方都可以使用并且非常简单的东西。

【问题讨论】:

您能否提供示例输入和预期输出的列表? “与我们拥有的每个版本都不兼容”是什么意思? 使用 URI 或 CGI 标准库模块来转义 html 【参考方案1】:

检查您的数据

首先,您的数据(如最初发布的那样)无法解析为规范化的电话号码。即使 HTML 实体 " 未转义,您最终会得到:

"(982) xxx-xxxx"]

这在字符串中嵌入了双引号和一个尾随方括号。这可能不是您想要的。如果可以,请确保您没有通过在 JSON 接收器中而不是在上游 API 中解决问题来解决问题。

使用 CGI 模块取消转义 HTML 实体

同时,如果您的目标主要是取消转义字符串中的 HTML 实体,您可以使用 Ruby 标准库中的 CGI#unescape_html 方法来实现。例如,使用没有尾随方括号的更正输入字符串:

require 'cgi'

phone_str = ""(982) xxx-xxxx""
CGI.unescape_html(phone_str).delete ?"
#=> "(982) xxx-xxxx"

请注意,简单地取消转义仍然会使您在字符串中嵌入双引号。您可以使用String#delete 轻松删除引号字符,但首先从数字中提取数字并规范化输出格式可能更容易。

使用 Rails 助手规范电话号码输出

考虑这个例子,它利用 Rails NumberHelper 模块来格式化从非数字字符的字符串中提取的数字:

require 'action_view/helpers/number_helper'
include ActionView::Helpers::NumberHelper

phone_str = ""(982) 555-1212"]"
number_to_phone phone_str.delete("^0-9"), area_code: true
#=> "(982) 555-1212"

这完全不需要处理 HTML 实体,因为您只关心字符串中的数字。当然还有其他方法可以提取数字,以及其他方法来格式化电话号码,但这肯定会让您开始。

【讨论】:

以上是关于如何在不使用 gsub 的情况下转义“的主要内容,如果未能解决你的问题,请参考以下文章

如何在不转义双引号的情况下使用 RestTemplate 发送 JSON 发布请求?

如何在不使用第三方程序的情况下重新映射我的 OSX 键盘?

如何在不使用 PDO 或 PHP 应用程序绑定的情况下解决二阶 SQL 注入

Ruby gsub 不会转义单引号

我可以在不转义属性值的情况下创建 Groovy 节点吗?

使用 Ruby gsub 转义 linux 路径名中的空格