1

我有这个代码:

function toDataUri( $html )
{
  # convert css URLs to data URIs
  $html = preg_replace_callback( "#(url\([\'\"]?)([^\"\'\)]+)([\"\']?\))#", 'create_data_uri', $html );
  return $html;
}

// callback function
private function create_data_uri( $matches )
{
  $filetype = explode( '.', $matches[ 2 ] );
  $filetype = trim(strtolower( $filetype[ count( $filetype ) - 1 ] ));

  // replace ?whatever=value from extensions
  $filetype = preg_replace('#\?.*#', '', $filetype);

  $datauri = $matches[ 2 ];
  $data =  get_file_contents( $datauri );

  if (! $data) return $matches[ 0 ];

  $data = base64_encode( $data );

  //compile and return a data: URI with the encoded image data
  return $matches[ 1 ] . "data:image/$filetype;base64,$data" . $matches[ 3 ];
}

它基本上在 HTML 文件中搜索具有格式的 URL,url(path)并将它们替换为 base 64 Data URIS。

问题是如果输入的 html 是几公斤,比如 10kb,返回最终响应需要很长时间。在这种情况下我们可以做任何优化吗?或者您有任何其他解决方案,当给定 html 时,它会搜索url(path)匹配项并将它们转换为数据 uris ?

4

1 回答 1

3

这个表达式已经很便宜了——从一个固定的字符串开始,不需要回溯。

在 PCRE 中,有一个S修饰符可以启用一些正则表达式优化,但它只对没有固定前缀的模式很重要。

它不应该很慢——对于像这样的简单正则表达式来说,10KB 并不多。也许瓶颈在其他地方?

  • 如果您url(在解析的文件中未关闭并且文件)末尾没有,那么它会扫描更多。[^\"\'\)]{0,1000}会限制这一点。但这是一个小的优化,只有当文件中存在病态语法错误时才会产生影响。
  • 您可以删除()整个表达式。第 0 次匹配总是捕获整个字符串。
于 2013-01-13T14:16:47.813 回答