Регулярное выражение для анализа URI данных изображения
Если у меня есть:
<img src="data:image/gif;base64,R0lGODlhtwBEANUAAMbIypOVmO7v76yusOHi49AsSDY1N2NkZvvs6VVWWPDAutZOWJ+hpPPPyeqmoNlcYXBxdNTV1nx+gN51c4iJjEdHSfbc19M+UOeZk7m7veSMiNtpauGBfu2zrc4RQSMfIP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAC3AEQAAAb/QJBwSCwaj8ikcslsOp/QqHRKrVqv2Kx2y+16v+CweEwum8/otHrNbrvf8Lh8Tq/b7/i8fs" />
Как я могу проанализировать часть данных в:
- Mime type (image/gif)
- Кодирование (base64)
- Данные изображения (двоичные данные)
Ответы
Ответ 1
EDIT: расширен, чтобы показывать использование
var regex = new Regex(@"data:(?<mime>[\w/\-\.]+);(?<encoding>\w+),(?<data>.*)", RegexOptions.Compiled);
var match = regex.Match(input);
var mime = match.Groups["mime"].Value;
var encoding = match.Groups["encoding"].Value;
var data = match.Groups["data"].Value;
ПРИМЕЧАНИЕ. Регулярное выражение применяется к введенному вводу. Если бы был указан параметр charset
, это не сработало бы и его пришлось бы переписать.
Ответ 2
На самом деле для этого вам не нужно регулярное выражение. Согласно Wikipedia, формат URI данных
data:[<MIME-type>][;charset=<encoding>][;base64],<data>
просто выполните следующие действия:
byte[] imagedata = Convert.FromBase64String(imageSrc.Substring(imageSrc.IndexOf(",") + 1));
Ответ 3
URI данных имеет некоторую сложность, они могут содержать параметры, тип носителя и т.д., И иногда вам нужно знать эту информацию, а не только данные.
Чтобы проанализировать URI данных и извлечь все соответствующие части, попробуйте следующее:
/**
* Parse a data uri and return an object with information about the different parts
* @param {*} data_uri
*/
function parseDataURI(data_uri) {
let regex = /^\s*data:(?<media_type>(?<mime_type>[a-z\-]+\/[a-z\-\+]+)(?<params>(;[a-z\-]+\=[a-z\-]+)*))?(?<encoding>;base64)?,(?<data>[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*)$/i;
let result = regex.exec(data_uri);
let info = {
media_type: result.groups.media_type,
mime_type: result.groups.mime_type,
params: result.groups.params,
encoding: result.groups.encoding,
data: result.groups.data
}
if(info.params)
info.params = Object.fromEntries(info.params.split(';').slice(1).map(param => param.split('=')));
if(info.encoding)
info.encoding = info.encoding.replace(';','');
return info;
}
Ответ 4
Вот мое регулярное выражение, в котором мне также нужно было разделить тип mime (image/jpg).
^data:(?<mimeType>(?<mime>\w+)\/(?<extension>\w+));(?<encoding>\w+),(?<data>.*)