正则表达式匹配和验证互联网媒体类型?

时间:2014-08-08 10:12:36

标签: regex validation media

我想通过我的API验证互联网类型输入。

你能帮助写一个正则表达式来匹配吗?

http://en.wikipedia.org/wiki/Internet_media_type

下面的示例类型
application/atom+xml
application/EDI-X12
application/xml-dtd
application/zip
application/vnd.openxmlformats-officedocument.presentationml.presentation
video/quicktime

必须符合标准:

type / media type name [+suffix]

由于

3 个答案:

答案 0 :(得分:4)

我最近需要比现有答案更严格地验证媒体类型。这是我提出的基于grammar from RFC 2045 Section 5.1RFC 7231 Section 3.1.1.1(在令牌和空格中不允许{}除了参数之间的交集)。对于具有(?:)非捕获组的类C语言:

ows = "[ \t]*";
token = "[0-9A-Za-z!#$%&'*+.^_`|~-]+";
quotedString = "\"(?:[^\"\\\\]|\\.)*\"";
type = "(application|audio|font|example|image|message|model|multipart|text|video|x-(?:" + token + "))";
parameter = ";" + ows + token + "=" + "(?:" + token + "|" + quotedString + ")";
mediaType = type + "/" + "(" + token + ")((?:" + ows + parameter + ")*)";

这最终会产生一个相当可怕的

"(application|audio|font|example|image|message|model|multipart|text|video|x-(?:[0-9A-Za-z!#$%&'*+.^_`|~-]+))/([0-9A-Za-z!#$%&'*+.^_`|~-]+)((?:[ \t]*;[ \t]*[0-9A-Za-z!#$%&'*+.^_`|~-]+=(?:[0-9A-Za-z!#$%&'*+.^_`|~-]+|\"(?:[^\"\\\\]|\\.)*\"))*)"

捕获类型,子类型和参数,或者只是

"(application|audio|font|example|image|message|model|multipart|text|video|x-(?:[0-9A-Za-z!#$%&'*+.^_`|~-]+))/([0-9A-Za-z!#$%&'*+.^_`|~-]+)"

省略参数。请注意,通过允许任何token type(如RFC 7231)而不是限制为"应用程序",&#,可以使这些更加向前兼容(并且不那么严格) 34;音频"等

在实际操作中,您可能还需要根据预期用途将输入限制为IANA Registered Media Typesmailcap或适合您的应用的特定类型。

答案 1 :(得分:2)

这非常简单:

\w+/[-+.\w]+

演示:http://regex101.com/r/oH5bS7/1

如果你想验证那里最多有一个+

\w+/[-.\w]+(?:\+[-.\w]+)?

答案 2 :(得分:1)

支持参数的更一般的正则表达式是:

(?P<main>\w+|\*)/(?P<sub>\w+|\*)(\s*;\s*(?P<param>\w+)=\s*=\s*(?P<val>\S+))?

演示:http://regex101.com/r/lQ3rX4/2