我想通过我的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]
由于
答案 0 :(得分:4)
我最近需要比现有答案更严格地验证媒体类型。这是我提出的基于grammar from RFC 2045 Section 5.1和RFC 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 Types或mailcap或适合您的应用的特定类型。
答案 1 :(得分:2)
答案 2 :(得分:1)
支持参数的更一般的正则表达式是:
(?P<main>\w+|\*)/(?P<sub>\w+|\*)(\s*;\s*(?P<param>\w+)=\s*=\s*(?P<val>\S+))?