我在论坛网站上有一个文本区域,想要在保存到数据库之前过滤用户输入的文本。我正在使用sanitize函数来删除所有html标签,然后尝试使用带有正则表达式的gsub。以下是我在控制器中尝试使用的内容 -
ActionView::Base.full_sanitizer.sanitize(params[:content]).gsub(/[^0-9a-z\\s#]/im,'')
我可以使用sanitize剥离html但无法获得gsub方法的正确正则表达式。对于我的文本区域,我想允许以下进行降价编辑 -
我想用空格替换所有其他字符以保证安全。
我是rails和regex的新手,所以任何指针都会受到赞赏。任何其他指示更好的secuirty也将不胜感激。
TIA
答案 0 :(得分:1)
发布我的评论,因为它适合你。
我的初步建议:
System.out
gsub(/(\#{3,4}|\*{1,2}|[\w. -]+|(?:\r\n|\r|\n){2,}|>{2}|:\/{2}|~{2}|={2})|./) { |m| m == $~[1] ? $~[1] : ' ' }
- 匹配3或4 \#{3,4}
s #
- 匹配1或2 \*{1,2}
s *
- 匹配1个或多个字母数字字符或下划线([\w. -]+
),点\w
或连字符.
-
- 2个或更多换行符(支持所有主要操作系统换行符)(?:\r\n|\r|\n){2,}
- 2 >{2}
s >
- 文字:\/{2}
://
- 2 tildes ~{2}
- 2个等号正则表达式包含一个捕获组(标有圆括号={2}
),其中包含我们需要保留的子串(您在上面列出它们)的备选方案(用(...)
符号连接),以及{ {1}}匹配我们将要替换的其他字符。
你说你提出的正则表达式是
|
它有一些修改过的部分.
。您应该知道(\#{3,4}|\*{1,2}|[\w. -]+|[\w, +]+|[\w! +]+|[\w: +]+|["\w" +]+|[:-?) +]+|[(\w) +]+|(?:\r\n|\r|\n){2,}|>{2}|:\/{2}|~{2}|={2})|.
表示一个字符类,其中包含任何字符,不是字符序列。因此,[\w, +]+|[\w! +]+|[\w: +]+|["\w" +]+|[:-?) +]+|[(\w) +]+
没有意义,因为它不代表[...]
,它只是意味着引号,字母数字,空格或加号。
["\w" +]
引起了更大的关注:a quote, alphanumeric, a quote and some spaces
此处创建了[:-?) +]
(ASCII table中的第58个分数)和-
之间的范围(63分秒符号) )。因此,它匹配* a :
,或?
,或:
,或;
,或<
或{{1} },或=
,空格或>
。
我希望这些信息可以帮助您进一步调整正则表达式。
对于?
,它是一种Ruby方式来添加一种回调函数:我们运行)
,每次匹配时,我们将其分配给+
变量,然后我们检查它是否等于捕获组1,然后我们将整个匹配替换为组1的内容(因此,我们保留我们需要的东西),如果没有,我们用空格替换(因为它匹配)通过我们模式中的最终{ |m| m == $~[1] ? $~[1] : ' ' }
。