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)それらをbase64データURIに置き換えます。

問題は、入力HTMLが10kbなどの数キロの場合、最終的な応答を返すのに何年もかかることです。そのような場合に実行できる最適化や、htmlが与えられるとurl(path)一致するものを検索し、それらをデータURIに変換する他の解決策はありますか?

4

1 に答える 1

3

式はすでに安価です—固定文字列で始まり、バックトラックする必要はありません。

PCREにSは、正規表現の最適化を可能にする修飾子がありますが、これは、プレフィックスが固定されていないパターンに対してのみ重要です。

遅くするべきではありません—このような単純な正規表現では10KBはそれほど多くありません。おそらくボトルネックはどこかにありますか?

  • url(解析されたファイルを閉じておらず)、ファイルの最後まで閉じていない場合は、もう少しスキャンします。[^\"\'\)]{0,1000}それを制限します。ただし、これはマイナーな最適化であり、ファイルに病理学的構文エラーがある場合にのみ違いが生じます。
  • ()式全体を削除できます。0番目の一致は、常に文字列全体をキャプチャしています。
于 2013-01-13T14:16:47.813 に答える