質問

正規表現がブラウザによって解釈される方法には大きな違いがあるに違いないと、私はますます気づいています。
たとえば、同僚は、アップロードされるファイルの拡張子が PDF であることを検証するために、次の正規表現を作成しました。

^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.pdf)$

これは Internet Explorer と Google Chrome では機能しますが、Firefox では機能しません。実際の PDF であっても、テストは常に失敗します。そこで、余分なものは無関係であると判断し、次のように単純化しました。

^.+\.pdf$

Firefox でも問題なく動作するようになり、IE や Chrome でも引き続き動作します。
これは ASP.NET の asp:FileUpload および RegularExpressionValidator コントロールに特有の癖なのでしょうか、それとも単にブラウザーが異なる方法で正規表現をサポートしていることが原因なのでしょうか?いずれにせよ、あなたが遭遇した後者の例にはどのようなものがありますか?

役に立ちましたか?

解決

私が知る限り、firefoxではアップロードの完全なパスを使用できません。この場合、正規表現の解釈は無関係と思われます。正規表現の実行において、最新のブラウザーの違いはまだわかりません。

他のヒント

実際の質問について:元の正規表現では、ドライブ文字またはUNCデバイス名で始まる値が必要です。 Firefoxが単にファイル名にそれを含めない可能性は十分にあります。また、クロスプラットフォームにする意図がある場合、ブラウザに関係なく、Windows以外のシステムではドライブ文字やUNCパスを使用しないため、その正規表現は失敗します。簡略化された正規表現(「.pdf」で終わる限り、何でも受け入れます)は、取得するファイル名のチェックとほぼ同等です。

ただし、元の質問に対するジョナサンのコメントは強調しすぎることはできません。ファイルの内容を判断する適切な手段としてファイル名を信頼することは決してありません。または、MIMEタイプ。 Webサーバーと通信するクライアントソフトウェア(ブラウザーではないこともあります)は、何かについてうそをつく可能性があります。この場合、受信したファイルをPDF形式を理解するコードに入力し、そのコードに有効なPDFかどうかを知らせることを意味します。ファイル名を確認すると、明らかに間違ったファイルを送信しようとするのを防ぐことができますが、受信したファイルの十分なテストではありません。

(追加の検証の必要性については知っているかもしれませんが、同様の状況で質問を見つけた次の人はそうではないかもしれません。)

javascriptを使用している場合、正規表現をスラッシュで囲まないと、Firefoxでエラーが発生します。

var regex = /^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].* ))(。pdf)$ /;

Dave が述べたように、Firefox はパスを提供せず、ファイル名のみを提供します。また、彼が述べたように、オペレーティング システム間の違いは考慮されていません。最善のチェ​​ックは、ファイル名が PDF で終わるかどうかを確認することだと思います。また、これはファイル名が PDF で終わるというだけで、それが有効な PDF であることを保証するものではありません。必要に応じて、内容をチェックして実際に PDF であることを確認することができます。

パターンの構文に関して、ブラウザ間の違いに気付いていません。ただし、C#の実装では後方参照が許可され、Javascriptの実装では許可されないため、C#とJavascriptの違いに気付きました。

JavaScript REはECMA標準で定義されていると思いますが、JSインタープリターには多くの違いがあるとは思いません。私は自分のプログラムで何も見つけていないか、記事で言及されていません。

ASPのものをそこに投げ入れるので、あなたのメッセージは実際には少し紛らわしいです。サーバー側の技術や生成されたコードについて話すとき、それがブラウザのせいだと結論付ける方法はわかりません。実際、ブラウザでJSについて話しているのか、アップロードフィールドの検証(少なくとも簡単な方法でFF3を使用することはできません)か、サーバー側(FFでもOperaでもない)について話しているのかどうかもわかりませんまた、Safariはアップロードされたファイルの完全なパスをアップロードしません。ChromeがIEを好むことを知って驚いた...)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top