3

RubyとRailsは初めてなので、これが簡単な質問であれば許してください。ユーザーがフォームで IMG URL を渡したときに、それが有効な URL であることを確認しようとしています。これが私のコードです:

if params[:url].include? 'http://' && (params[:url].include? '.jpg' || params[:url].include? '.png')

これはエラーを返します。これはそれを行うための最良の方法でもありますか?どうすればいいですか?ありがとう。

4

3 に答える 3

15
if my_str =~ %r{\Ahttps?://.+\.(?:jpe?g|png)\z}i

正規表現は次のように説明しました。

  • %r{...}— に似た正規表現リテラルですが、エスケープせずに内部で使用/.../できます/
  • \A— 文字列の先頭 (^は単なる行の先頭です)
  • http — リテラルテキスト
  • s? — オプションで「s」が続きます (https:// を許可するため)
  • ://— リテラルテキスト ( のようなものを防ぐためhttp-whee.jpg)
  • .+ — 1 つ以上の文字 (改行ではない)
  • \. — リテラルのピリオド (これが対象の拡張子であることを確認してください)
  • (?:aaa|bbb)aaa— どちらかまたはここを許可しますbbbが、結果をキャプチャしません
  • jpe?g— 「jpg」または「jpeg」のいずれか
  • png— リテラルテキスト
  • \z— 文字列の終わり ($は単なる行末です)
  • i— 大文字と小文字を区別しないで一致させる (.JPGと同様に許可する.jpg)

ただし、この (より読みやすい) バージョンだけで回避できる場合があります。

allowed_extensions = %w[.jpg .jpeg .png]
if my_str.start_with?('http://') &&
   allowed_extensions.any?{ |ext| my_str.end_with?(ext) }
于 2012-07-13T21:42:37.130 に答える
3

@Phrogzの回答の方が優れています。いくつかのルビーライブラリでこれを試しました。

require 'uri'

extensions = %w( .jpg .jpeg .png )
schemes = %w( http https )
string = params[:url]

if (schemes.include?URI.parse(string).scheme) && (extensions.include?File.extname(string))

end
于 2012-07-14T08:36:47.043 に答える
1

正規表現はコードを短縮しますが、私はそのようなチェックをすべて 1 つのパターンで行うことを好みません。それは自己文書化/メンテナンスのことです。単一の正規表現の方が高速ですが、必要なプロトコルや画像の種類が増えると、パターンはますます扱いにくくなります。

これが私がすることです:

str[%r{^http://}i] && str[/\.(?:jpe?g|png)$/]
于 2012-11-11T17:40:56.497 に答える