1

< a >タグで画像をラップし、それらのパスなどを変更するために正規表現を使用してきました。ラッピングに関する多くのスレッドを読んだので、これにはdomを使用する方が良いことはわかっていますが、方法を理解できません。

これは私が使用しているものです:

$comments = (preg_replace('@(<img.+src=[\'"]/uploads/userdirs/admin)(?:.*?/)(.+?)\.(.+?)([\'"].*?>)@i', '<a class="gallery" rel="'.$pagelink.'" href=/uploads/userdirs/'.$who.'/$2.$3>$1/mcith/mcith_$2.$3$4</a>', $comments));

必要なタグで各画像を正常にラップします。ただし、提供された文字列 ($comments) に適切なマークアップがある場合に限ります。

<p><img src="/uploads/userdirs/admin/1160501362291.png" alt="" width="1280" height="960" /></p>
<p><img src="/uploads/userdirs/admin/100_Bullets_68_1280x1024.jpg" alt="" width="1280" height="1024" /></p>

このように提示すると、うまくいきます。私は tinymce を使用しているので、Enter で改行すると < p > でラップされます。しかし、そうしないと、HTML が次のように見えるように画像を次々と挿入すると、次のようにはなりません。

<p><img src="/uploads/userdirs/admin/1160501362291.png" alt="" width="1280" height="960" /><img src="/uploads/userdirs/admin/100_Bullets_68_1280x1024.jpg" alt="" width="1280" height="1024" /></p>

代わりに、これら 2 つの画像を同じ < a > タグでラップします。出力を次のようにします。

<p><a class="gallery" rel="test" href="/uploads/userdirs/admin/100_Bullets_68_1280x1024.jpg">
<img src="/uploads/userdirs/admin/1160501362291.png" alt="" width="1280" height="960">
<img src="/uploads/userdirs/admin/mcith/mcith_100_Bullets_68_1280x1024.jpg" alt="" width="1280" height="1024">
</a></p>

これは間違っています。私が望む出力はこれです:

<p><a class="gallery" rel="test2" href="/uploads/userdirs/admin/100_Bullets_68_1280x1024.jpg"><img src="/uploads/userdirs/admin/mcith/mcith_100_Bullets_68_1280x1024.jpg" alt="" width="1280" height="1024"></a></p>
<p><a class="gallery" rel="test2" href="/uploads/userdirs/admin/1154686260226.jpg"><img src="/uploads/userdirs/admin/mcith/mcith_1154686260226.jpg" alt="" width="1280" height="800"></a></p>
4

2 に答える 2

2

いくつかの詳細は省きましたが、DOMDocument を使用してそれを行う方法は次のとおりです。

$s = <<<EOM
<p><img src="/uploads/userdirs/admin/1160501362291.png" alt="" width="1280" height="960" /></p>
<p><img src="/uploads/userdirs/admin/100_Bullets_68_1280x1024.jpg" alt="" width="1280" height="1024" /></p>
EOM;

$d = new DOMDocument;
$d->loadHTML($s);

foreach ($d->getElementsByTagName('img') as $img) {
    $img_src = $img->attributes->getNamedItem('src')->nodeValue;
    if (0 === strncasecmp($img_src, '/uploads/userdirs/admin', 23)) {
        $a = $d->createElement('a');

        $a->setAttribute('class', 'gallery');
        $a->setAttribute('rel', 'whatever');
        $a->setAttribute('href', '/uploads/userdirs/username/' . $img_src);

        // disconnect image tag from parent
        $img->parentNode->replaceChild($a, $img);

        // and move to anchor
        $a->appendChild($img);
    }
}

echo $d->saveHTML();
于 2012-04-26T10:21:09.487 に答える
1

.*正規表現を。で変更する必要があります[^>]*。後者は次のことを意味します:すべての文字は。よりも期待し>ます。正規表現は可能な限り長く一致するためです。この追加の条件がないと、2つ<img>のが一致することになります。

于 2012-04-26T09:44:38.553 に答える