Как игнорировать типы файлов в веб-сканере? - PullRequest
0 голосов
/ 17 января 2012

Я пишу сканер и хочу игнорировать URL-адреса, которые ссылаются на двоичные файлы:

$exclude = %w(flv swf png jpg gif asx zip rar tar 7z gz jar js css dtd xsd ico raw mp3 mp4 wav wmv ape aac ac3 wma aiff mpg mpeg avi mov ogg mkv mka asx asf mp2 m1v m3u f4v pdf doc xls ppt pps bin exe rss xml)

Как проверить URI для одного из этих окончаний?

@url = URI.parse(url)

должен быть установлен, если он не содержит ни одного из вышеприведенных суффиксов.

Ответы [ 3 ]

2 голосов
/ 17 января 2012

использовать URI # path:

unless URI.parse(url).path =~ /\.(\w+)$/ && $exclude.include?($1)
  puts "downloading #{url}..."
end
1 голос
/ 17 января 2012

В Ruby отсутствует действительно полезный модуль, который есть в Perl, который называется Regexp :: Assemble. Ruby's Regexp :: Union не находится рядом Вот как использовать Regexp :: Assemble и его результат:

use Regexp::Assemble;

my @extensions = sort qw(flv swf png jpg gif asx zip rar tar 7z gz jar js css dtd xsd ico raw mp3 mp4 wav wmv ape aac ac3 wma aiff mpg mpeg avi mov ogg mkv mka asx asf mp2 m1v m3u f4v pdf doc xls ppt pps bin exe rss xml);

my $ra = Regexp::Assemble->new;
$ra->add(@extensions);

print $ra->re, "\n";

Какие выходы:

(?-xism:(?:m(?:p(?:[234]|e?g)|[1o]v|k[av]|3u)|a(?:s[fx]|iff|ac|c3|pe|vi)|p(?:p[st]|df|ng)|r(?:a[rw]|ss)|w(?:m[av]|av)|x(?:ls|ml|sd)|j(?:ar|pg|s)|d(?:oc|td)|g(?:if|z)|f[4l]v|bin|css|exe|ico|ogg|swf|tar|zip|7z))

Perl поддерживает флаг s, а Ruby - нет, поэтому его нужно убрать из ?-xism, и мы хотим игнорировать регистр символов, поэтому необходимо переместить i, в результате чего ?i-xm .

Включите это в скрипт Ruby как регулярное выражение:

REGEX = /(?i-xm:(?:m(?:p(?:[234]|e?g)|[1o]v|k[av]|3u)|a(?:s[fx]|iff|ac|c3|pe|vi)|p(?:p[st]|df|ng)|r(?:a[rw]|ss)|w(?:m[av]|av)|x(?:ls|ml|sd)|j(?:ar|pg|s)|d(?:oc|td)|g(?:if|z)|f[4l]v|bin|css|exe|ico|ogg|swf|tar|zip|7z))/

@url = URI.parse(url)

puts @url.path[REGEX]

uri = URI.parse('http://foo.com/bar.jpg')
uri.path        # => "/bar.jpg"
uri.path[REGEX] # => "jpg"

См. " Существует ли эффективный способ выполнения сотен подстановок текста в Ruby? " для получения дополнительной информации об использовании Regexp :: Assemble из Ruby.

0 голосов
/ 17 января 2012

Вы можете удалить расширение файла URL с помощью регулярного выражения или split (я показал последнее здесь, но учтите, что это также будет соответствовать некоторым искаженным URL, таким как http://foo.exe), затем используйте Array#include? проверить членство:

@url = URI.parse(url) unless $exclude.include?(url.split('.').last)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...