5

だから私はかなり長い間これに取り組んできましたが、私が得た最良の方法は、画像をリンクでラップし、画像タグの後にスパンを付けることです:

<a href="">
  <img src="">
  <span></span>
</a>

しかし、私が欲しいのは:

<a href="">
  <span></span>
  <img src="">
</a>

あらゆる種類のバリエーションと位置を試しました

$img->parentNode->appendChild($dom->createElement('span'), $img);

私のコードのあらゆる種類の場所での insertBefore() の使用と、私はphp DOMのものにかなり慣れていないので、完全にアイデアがありません。私の情報源:

foreach($dom->getElementsByTagName('img') as $img)
{
$fancyHref = $dom->createElement('a');

                        $clone = $fancyHref->cloneNode();
                        $img->parentNode->replaceChild($clone, $img);
                        $clone->appendChild($img);  
                        $img->parentNode->appendChild($dom->createElement('span'));
};

更新: 私の目標を明確にするために: HTML に img タグがあります。php dom を通過した後、img タグを a タグでラップし、image タグの前に span タグを付けます。

<img src="" />

<a href="">
   <span class=""></span>
   <img src="" />
</a>

これを行うための現時点での私のコード(スパンなし)

foreach($dom->getElementsByTagName('img') as $img)
            {               
                $src = $img->getAttribute('src');
                $filename = substr(strrchr($src , '/') ,1); 
                $filename = preg_replace('/^[.]*/', '', $filename);
                $filename = explode('.', $filename); 
                $filename = $filename[0];

                if($this->imagesTitles[$this->currentLanguage][$filename] !== '')
                {
                    $img->setAttribute('title', $this->imagesTitles[$this->currentLanguage][$filename]);
                    $img->setAttribute('alt', $this->imagesTitles[$this->currentLanguage][$filename]);
                }
                else
                {
                    $img->removeAttribute('title');
                    $img->removeAttribute('alt');
                }

                $classes = explode(' ', $img->getAttribute('class'));
                if(!in_array('no-enlarge', $classes))
                {
                    $fancyHref = $dom->createElement('a');
                    $span = $dom->createElement('span');
                    $span->setAttribute('class', 'magnifier');
                    $fancyHref->setAttribute('class', 'enlarge');
                    $fancyHref->setAttribute('rel', 'enlarge');
                    $fancyHref->setAttribute('href', $img->getAttribute('src'));
                    if($img->getAttribute('title') !== '')
                    {
                        $fancyHref->setAttribute('title', $img->getAttribute('title'));
                        $fancyHref->setAttribute('alt', $img->getAttribute('title'));
                    }
                    $clone = $fancyHref->cloneNode();

                    $img->parentNode->replaceChild($clone, $img);   
                    $clone->appendChild($img);
                    $img->parentNode->insertBefore($span, $img);                        
                }

                $img->setAttribute('class', trim(str_replace('no-enlarge', '', $img->getAttribute('class'))));

                if($img->getAttribute('class') === '')
                {
                    $img->removeAttribute('class');
                }
            }
4

2 に答える 2

1

DOMNode->insertBefore()メソッド ( docs )を使用できます。の形をしてい$parentNode->insertBefore( $nodeToBeInserted, $nodeToInsertBefore )ます。あなたのコードは次のようになります。

$img->parentNode->insertBefore( $dom->createElement('span'), $img );

DOMNode->appendChild()( docs ) には 1 つの引数 (挿入されたノード) しかなく、このノードは常に最後の childNode の後に挿入されます。

編集:

$img->parentNode->appendChild($dom->createElement('span'));コードをテストしました。テスト ケースで私の行に置き換えると、正しい形式になります。ただし、非常に紛らわしい方法で要素を操作しています。それに加えて、更新されたコードをテストすると、目的の形式になるか、スパン要素がまったくない状態になります...

置き換えたい要素は画像です。これは、元のドキュメントにある唯一の要素であるためです。したがって、その要素を複製する必要があります。現在のコードは階層エラーを排除しますが、競合する要素だけでなく、変更されたすべてのコードをコピーすることになり、メモリと時間の無駄になります。競合する要素をコピーすると、簡単です。要素を表示したい順序で a に追加します。イメージを追加するときは、代わりにクローンを追加してください。操作しないでください$img。イメージを操作する必要がある場合は、代わりにクローンを操作する必要があります。$img次に、操作した要素に置き換えるだけです($fancyHrefあなたの場合)。

$html = '<img src="">';
$dom = new DOMDocument();
$dom->loadHTML($html);

foreach($dom->getElementsByTagName('img') as $img) {
  $fancyHref = $dom->createElement('a');
  $clone = $img->cloneNode();
  $span = $dom->createElement( 'span' );
  #... do whatever you need to do to this span, the clone and the a element ...

  #... when you are done, you can simply append all elements you have been manipulating ...
  $fancyHref->appendChild( $span );
  $fancyHref->appendChild( $clone );

  $img->parentNode->replaceChild( $fancyHref, $img );
};

echo $dom->saveHTML();
于 2013-08-31T12:36:55.930 に答える