0

ドキュメントの画像の前後にいくつかのタグを追加し、それらを一度に数値化する必要があります。HTML ドキュメント コードは次のとおりです。

....

<img src="http://img.example.com/img/mage1.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/image72.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/imagstr.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/image.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/imgger.gif" alt="sometile"> <br> 
<img src="http://img.example.com/img/somepic.png" alt="sometile"> <br> 

このような結果コードが必要です

<div><a name="#pic1"></a><img src="http://img.example.com/img/mage1.jpg" alt="sometile"></div>
<div><a name="#pic2"></a><img src="http://img.example.com/img/image72.jpg" alt="sometile"> </div> 
<div><a name="#pic3"></a><img src="http://img.example.com/img/imagstr.jpg" alt="sometile"> </div> 
<div><a name="#pic4"></a><img src="http://img.example.com/img/image.jpg" alt="sometile"> </div> 
<div><a name="#pic5"></a><img src="http://img.example.com/img/imgger.gif" alt="sometile"> </div> 
<div><a name="#pic6"></a><img src="http://img.example.com/img/somepic.png" alt="sometile"> </div> 
4

3 に答える 3

1

通常どおり、 DOMを使用してそれを行うこともできます。

$counter = 0;
$doc = new DOMDocument();
$doc->loadHTML($str);
foreach ($doc->getElementsByTagName("img") as $img) {
    $sibling = $img->nextSibling;
    while ($sibling) {
        if ($sibling instanceof DOMElement && $sibling->tagName === 'br') {
            $sibling->parentNode->removeChild($sibling);
        }
        $sibling = $sibling->nextSibling;
    }
    $div = $doc->createElement("div");
    $img->parentNode->replaceChild($div, $img);
    $a = $doc->createElement("a");
    $a->setAttribute("name", "pic" . (++$counter));
    $a->appendChild($img);
    $div->appendChild($a);
}
$str = '';
foreach (simplexml_import_dom($doc->getElementsByTagName("body")->item(0))->children() as $elem) {
    $str .= $elem->asXML();
}
于 2010-12-01T12:50:26.893 に答える
0

私は正規表現+HTMLのファンではありませんが、ここに行きます(単純な正規表現を作成しただけです。おそらく、すでに正規表現を持っています)。

$s = '<img src="http://img.example.com/img/mage1.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/image72.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/imagstr.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/image.jpg" alt="sometile"> <br> 
<img src="http://img.example.com/img/imgger.gif" alt="sometile"> <br> 
<img src="http://img.example.com/img/somepic.png" alt="sometile"> <br>';

$i = 0;
function wrap($s) {
        global $i;
        $i++;
        return sprintf('<div><a name="pic%d">%s</div>', $i, $s);
}

print preg_replace('#(<img [^>]+?>) <br>#e', "wrap('\\1')", $s);

デモ

重要な部分は、のe修飾子preg_replace()です。「例4「e」修飾子の使用」を参照してください。


編集
コメントで指摘されているように、グローバル変数の最良の名前で$iはありません。これを単純な「1回限りの」変換として使用する場合は、問題ない可能性があります。そうでない場合は、名前を競合しない名前に変更します。またはpublic static、クラスに入れます。

また、preg_replace_callback()存在します。関数名を文字列として渡し、ほぼ同じように醜い評価をしていると思いますが、より適していますfunctionName('arg'):)

于 2010-12-01T12:14:37.647 に答える
0

まず第一に、HTMLを処理するために正規表現を使用することは想定されていません。

ただし、この場合、ほぼフルラインを処理しているので簡単です。

$code = '<img src="http://img.example.com/img/mage1.jpg" alt="sometile"> <br>
<img src="http://img.example.com/img/image72.jpg" alt="sometile"> <br>
<img src="http://img.example.com/img/imagstr.jpg" alt="sometile"> <br>
<img src="http://img.example.com/img/image.jpg" alt="sometile"> <br>
<img src="http://img.example.com/img/imgger.gif" alt="sometile"> <br>
<img src="http://img.example.com/img/somepic.png" alt="sometile"> <br>';

function get_num_row($matches) {
    global $last_num;
    return '<div><a name="pic' . (++$last_num) . '">' . trim($matches[1]) . '</a></div>';
}

$last_num = 0;
$code = preg_replace_callback('/^(.*)<br>$/m', 'get_num_row', $code);
echo $code;

出力:

<div><a name="pic1"><img src="http://img.example.com/img/mage1.jpg" alt="sometile"></a></div>
<div><a name="pic2"><img src="http://img.example.com/img/image72.jpg" alt="sometile"></a></div>
<div><a name="pic3"><img src="http://img.example.com/img/imagstr.jpg" alt="sometile"></a></div>
<div><a name="pic4"><img src="http://img.example.com/img/image.jpg" alt="sometile"></a></div>
<div><a name="pic5"><img src="http://img.example.com/img/imgger.gif" alt="sometile"></a></div>
<div><a name="pic6"><img src="http://img.example.com/img/somepic.png" alt="sometile"></a></div>

もちろん、コールバックを再度使用する場合は、に設定$last_numする必要があります。0グローバル変数または静的変数なしでそれを行う方法はありません。ただし、コールバックを1回だけ使用する場合は、に変更global $last_num;するだけstatic $last_num = 0;です。その後、リセットされる可能性はなく、永久に増分しますが、グローバル名前空間が乱雑になることはありません。

于 2010-12-01T12:15:07.240 に答える