Подтвердить что ты не робот

Проверьте, содержит ли строка какую-либо подстроку в массиве в 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?

4b9b3361

Ответ 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

Я думаю, что мы можем разделить этот вопрос на две части:

  1. Как убрать нежелательные данные
  2. Как проверить правильность очищенных данных

Первый хорошо ответил выше. Для второго я бы сделал следующее:

(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