我正在使用 Tmail 库,对于电子邮件中的每个附件,当我这样做时
attachment.content_type
,有时我不仅得到内容类型,还得到名称。例子:
image/jpeg; name=example3.jpg
image/jpeg; name=example.jpg
image/jpeg; name=photo.JPG
image/png
我有一组有效的内容类型,如下所示:
VALID_CONTENT_TYPES = ['image/jpeg']
我希望能够检查内容类型是否包含在任何有效的内容类型数组元素中。
在 Ruby 中这样做的最佳方法是什么?
Enumerable#any?
: 检查每个字符串,直到找到匹配项
str = "alo eh tu"
['alo','hola','test'].any? { |word| str.include?(word) }
虽然将字符串数组转换为正则表达式可能会更快:
words = ['alo','hola','test']
r = /#{words.join("|")}/ # assuming there are no special chars
r === "alo eh tu"
如果
image/jpeg; name=example3.jpg
是字符串:
("image/jpeg; name=example3.jpg".split("; ") & VALID_CONTENT_TYPES).length > 0
即VALID_CONTENT_TYPES 数组和
attachment.content_type
数组(包括类型)的交集(两个数组共有的元素)应大于 0。
这至少是许多方式中的一种。
因此,如果我们只想存在匹配项:
VALID_CONTENT_TYPES.inject(false) do |sofar, type|
sofar or attachment.content_type.start_with? type
end
如果我们想要匹配,这将给出数组中匹配字符串的列表:
VALID_CONTENT_TYPES.select { |type| attachment.content_type.start_with? type }
# will be true if the content type is included
VALID_CONTENT_TYPES.include? attachment.content_type.gsub!(/^(image\/[a-z]+).+$/, "\1")
我想我们可以把这个问题一分为二:
第一个问题在上面已经得到了很好的回答。对于第二个,我会执行以下操作:
(cleaned_content_types - VALID_CONTENT_TYPES) == 0
这个解决方案的好处是,您可以轻松创建一个变量来存储不需要的类型,以便稍后列出它们,如下例所示:
VALID_CONTENT_TYPES = ['image/jpeg']
cleaned_content_types = ['image/png', 'image/jpeg', 'image/gif', 'image/jpeg']
undesired_types = cleaned_content_types - VALID_CONTENT_TYPES
if undesired_types.size > 0
error_message = "The types #{undesired_types.join(', ')} are not allowed"
else
# The happy path here
end
我使用下一个助手:
class String
# line.includes_any? ['keyword_1', 'keyword_2']
# line.includes_any? 'keyword_1', 'keyword_2'
def includes_any?(*arr)
arr.flatten.any? { self.include? _1 }
end
end