1

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

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

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

^.+\.pdf$

現在は Firefox で正常に動作するだけでなく、IE と Chrome でも引き続き動作します。
これは、ASP.NET の asp:FileUpload および RegularExpressionValidator コントロールに固有の癖ですか、それとも単に正規表現をさまざまな方法でサポートしているブラウザーが異なるためですか? いずれにせよ、あなたが遭遇した後者のいくつかは何ですか?

4

6 に答える 6

4

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

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

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

于 2008-11-08T01:47:53.140 に答える
3

私の知る限り、Firefox ではアップロードのフル パスを取得できません。この場合、正規表現の解釈は関係ないようです。正規表現の実行において、最新のブラウザ間の違いはまだ見たことがありません。

于 2008-11-08T00:32:24.993 に答える
1

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

于 2008-11-08T02:04:37.367 に答える
1

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

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

于 2008-11-07T23:59:20.117 に答える
0

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

于 2008-11-08T00:42:15.473 に答える
0

JavaScript RE は ECMA 標準によって定義されていると思いますが、JS インタープリター間に多くの違いがあるとは思えません。私のプログラムでは何も見つかりませんでしたし、記事で言及されているのを見たこともありません。

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

于 2008-11-08T16:15:59.363 に答える