Pergunta

Estou cada vez mais ciente de que deve haver grandes diferenças nas maneiras pelas quais expressões regulares serão interpretadas pelos navegadores.
Como exemplo, um colega de trabalho havia escrito essa expressão regular, para validar que um arquivo carregado teria uma extensão em PDF:

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

Isso funciona no Internet Explorer e no Google Chrome, mas não funciona no Firefox. O teste sempre falha, mesmo para um PDF real. Então eu decidi que as coisas extras eram irrelevantes e simplificadas para:

^.+\.pdf$

E agora funciona bem no Firefox, além de continuar trabalhando no IE e Chrome.
Isso é uma peculiaridade específica para os controles ASP: FileUpload e RegulAxpressionValidator no ASP.NET, ou é simplesmente devido a diferentes navegadores que apoiam o Regex de maneiras diferentes? De qualquer maneira, quais são alguns dos últimos que você encontrou?

Foi útil?

Solução

Até onde eu sei, o Firefox não permite que você tenha o caminho completo de um upload. A interpretação das expressões regulares parece irrelevante neste caso. Ainda tenho que ver nenhuma diferença entre os navegadores modernos na execução regular da expressão.

Outras dicas

Em relação à pergunta real: o regex original exige que o valor seja iniciado com uma letra de unidade ou nome do dispositivo UNC. É bem possível que o Firefox simplesmente não inclua isso no nome do arquivo. Observe também que, se você tiver alguma intenção de ser uma plataforma cruzada, o REGEX falharia em qualquer sistema que não seja do Windows, independentemente do navegador, pois eles não usam letras de unidade ou caminhos UNC. Seu regex simplificado ("Aceite qualquer coisa, desde que termine com .pdf") é tão bom quanto a verificação de nome de arquivo que você receberá.

No entanto, O comentário de Jonathan à pergunta original não pode ser enfatizado demais. Jamais, sempre Confie no nome do arquivo como um meio adequado de determinar seu conteúdo. Ou o tipo MIME, para esse assunto. O software cliente conversando com o seu servidor da Web (que pode nem ser um navegador) pode mentir para você sobre qualquer coisa e você nunca saberá, a menos que o verificar. Nesse caso, isso significa alimentar o arquivo recebido em algum código que entende o formato PDF e ter esse código informar se é um PDF válido ou não. Verificar o nome do arquivo pode ajudar a impedir que as pessoas tentem enviar arquivos obviamente incorretos, mas não é um teste suficiente dos arquivos recebidos.

(Percebo que você pode saber sobre a necessidade de validação adicional, mas a próxima pessoa que tem uma situação semelhante e encontra sua pergunta pode não.)

Se você estiver usando o JavaScript, não encerrar o regex com slashes causa erro no Firefox.

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

Como Dave mencionou, o Firefox não dá o caminho, apenas o nome do arquivo. Além disso, como ele mencionou, isso não representa diferenças entre os sistemas operacionais. Eu acho que a melhor verificação que você poderia fazer seria verificar se o nome do arquivo termina com o PDF. Além disso, isso não garante que seja um PDF válido, apenas que o nome do arquivo termine com o PDF. Dependendo das suas necessidades, convém verificar se é realmente um PDF verificando o conteúdo.

Não notei diferença entre os navegadores em relação à sintaxe do padrão. No entanto, notei uma diferença entre C# e JavaScript, pois a implementação de C# permite referências de volta e a implementação do JavaScript não.

Acredito que o JavaScript Res são definidos pelo padrão ECMA, e duvido que haja muitas diferenças entre os intérpretes do JS. Não encontrei nenhum, em meus programas, ou visto mencionado em um artigo.

Sua mensagem é realmente um pouco confusa, já que você joga coisas ASP lá. Não vejo como você conclui que é culpa do navegador quando você fala sobre a tecnologia do lado do servidor ou o código gerado. Na verdade, nem sabemos se você está falando sobre JS no navegador, validação do campo de upload (você não pode mais fazê -lo, pelo menos de uma maneira simples, com FF3) ou no lado do servidor (nem FF nem ópera Nem o Safari carrega o caminho completo do arquivo carregado. Estou surpreso ao saber que o Chrome gosta do IE ...).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top