0

すべての相対的な背景画像のパスを絶対パスに置き換えたい。そんなに多くの時間を試した後、私はこれを解決することができませんでした。私の現在のコードは最後の画像パスのみを解決します。このコードでは、パスリゾルバー関数(このリファレンスから:url_to_absolute())を使用しています。

<?php

require './url_to_absolute.php';
$css = "
    .selector1{
        background-image:url(../dir1/images/image.jpg);
        width:100%;
    }
    .selector2{
        background-image:url(\"../dir1/images/image2.jpg\");
        color:black;
    }
    .selector3{
        background-image:url( 'dir1/images/image3.jpg' );
        text-align:left;
    }
    .selector4{
        background-image:url( \"dir1/images/image4.jpg\" );
        text-align:left;
    }           
" ;
$base_url = 'http://www.example.com/'; 

$pattern  = "/(?<=\()(.*?)(?=\))/s";
preg_match_all($pattern, $css, $matches);

foreach($matches[1] as $url){
        $url = trim($url);
        $url = str_replace("\"", "", $url);
        $url = str_replace("'", "", $url);
        $full_path = url_to_absolute($base_url, $url);
        $new_css = str_replace($url, $full_path, $css);     
}
print $new_css;

?>

結果を生成します-

.selector1{ background-image:url(../dir1/images/image.jpg); width:100%; } 
.selector2{ background-image:url("../dir1/images/image2.jpg"); color:black; } 
.selector3{ background-image:url( 'dir1/images/image3.jpg' ); text-align:left; } 
.selector4{ background-image:url( "http://www.example.com/dir1/images/image4.jpg" ); text-align:left; } 

アドバイスしてください。

4

1 に答える 1

1

その巧妙さについて受け入れられた答えに感謝しますが、それは私がPHPで見た中で最も複雑な関数の1つかもしれません...

これは、はるかに把握しやすい場合(正規表現をニーズに適合させる):

function urlsToAbsolute($baseUrl, $html) {

    preg_match_all('/(href="|src=")([^"#]+)(")/i', $html, $matches);

    foreach ($matches[2] as $num => $match) {
        $codec[$match] = url_to_absolute($baseUrl, $match);
    }

    return strtr($html, $codec);
}
于 2013-07-29T11:32:17.887 に答える