我有这段代码:
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(path)
的网址,并将其替换为base 64 Data URIS。
问题是如果输入html是几公斤,例如10kb,则返回最终响应需要很长时间。在这种情况下我们可以做任何优化,或者你有任何其他解决方案,当给出html时,它会搜索url(path)
匹配并将它们转换为数据uris吗?
答案 0 :(得分:3)
表达式已经很便宜 - 以固定字符串开头,不需要回溯。
在PCRE中有S
修饰符可以启用一些正则表达式优化,但只对没有固定前缀的模式有用。
它应该不会很慢 - 对于像这样的简单正则表达式,10KB并不多。也许瓶颈在其他地方?
url(
而文件的末尾没有)
,那么它会扫描一下。 [^\"\'\)]{0,1000}
会限制这一点。但这是一个次要的优化,只有在文件中存在病态语法错误时才会有所不同。()
。第0场比赛总是捕捉整个弦乐。