Проверьте, содержит ли строка какую-либо подстроку в массиве в Ruby
Я использую библиотеку 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?
Ответы
Ответ 1
Существует несколько способов сделать это. Вы можете проверить каждую строку до тех пор, пока совпадение не будет найдено с помощью Enumerable#any?
:
str = "alo eh tu"
['alo','hola','test'].any? { |word| str.include?(word) }
Хотя может быть быстрее преобразовать массив строк в Regexp:
words = ['alo','hola','test']
r = /#{words.join("|")}/ # assuming there are no special chars
r === "alo eh tu"
Ответ 2
Итак, если мы просто хотим существования совпадения:
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 }
Ответ 3
Если image/jpeg; name=example3.jpg
является строкой:
("image/jpeg; name=example3.jpg".split("; ") & VALID_CONTENT_TYPES).length > 0
то есть. пересечение (элементы, общие для двух массивов) массива VALID_CONTENT_TYPES и массив attachment.content_type
(включая тип) должно быть больше 0.
Это по крайней мере один из многих способов.
Ответ 4
# will be true if the content type is included
VALID_CONTENT_TYPES.include? attachment.content_type.gsub!(/^(image\/[a-z]+).+$/, "\1")
Ответ 5
Я думаю, что мы можем разделить этот вопрос на две части:
- Как убрать нежелательные данные
- Как проверить правильность очищенных данных
Первый хорошо ответил выше. Для второго я бы сделал следующее:
(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