Подтвердить что ты не робот

Регулярное выражение для анализа URI данных изображения

Если у меня есть:

<img src="data:image/gif;base64,R0lGODlhtwBEANUAAMbIypOVmO7v76yusOHi49AsSDY1N2NkZvvs6VVWWPDAutZOWJ+hpPPPyeqmoNlcYXBxdNTV1nx+gN51c4iJjEdHSfbc19M+UOeZk7m7veSMiNtpauGBfu2zrc4RQSMfIP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAC3AEQAAAb/QJBwSCwaj8ikcslsOp/QqHRKrVqv2Kx2y+16v+CweEwum8/otHrNbrvf8Lh8Tq/b7/i8fs" />

Как я могу проанализировать часть данных в:

  • Mime type (image/gif)
  • Кодирование (base64)
  • Данные изображения (двоичные данные)
4b9b3361

Ответ 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>.*)