使用PHP和DOMDocument替换<img/>标记

时间:2016-11-16 21:48:59

标签: php html tags domdocument

我使用的是PHP,我想从此代码中删除<p>代码:

<p><img alt="" src="/sites/default/files/art/w2.jpg" style="height:395px; width:800px" /></p>

然后我要重写img标签,如下所示:

<figure><img src="/sites/default/files/art/w2.jpg" /></figure>

我试图使用DOMDocument来实现这一目标。

这是我的代码:

        $document = new DOMDocument;
        $document->loadHTML($body);
        $embeds= $document->getElementsByTagName('img');
        foreach ($embeds as $embed) {
            $src= $embed->getAttribute('src');
            $link= $document->createElement('figure');
            $link= $document->createElement('img');
            $link->setAttribute('src', $src);
            $embed->parentNode->replaceChild($link, $embed);
        }

到目前为止,我还没能做到这一点。

3 个答案:

答案 0 :(得分:0)

我尝试了以下内容,它似乎产生了预期的结果。我发现当删除/修改时,通过一组dom节点向后迭代经常在其他方法失败时起作用。

        $body='
        <html>
            <head>
                <title>DOM</title>
            </head>
            <body>
                <p>
                    <img alt="" src="/sites/default/files/art/w2.jpg" style="height:395px; width:800px" />
                </p>
                <p>
                    <img alt="" src="/sites/default/files/art/w3.jpg" style="height:395px; width:800px" />
                </p>
                <p>
                    <img alt="" src="/sites/default/files/art/w4.jpg" style="height:395px; width:800px" />
                </p>
            </body>
        </html>';


        $dom = new DOMDocument;
        $dom->loadHTML( $body );

        $col = $dom->getElementsByTagName('img');
        if( !empty( $col ) ){

            for ( $i = $col->length; --$i >= 0; ) {
                $node = $col->item( $i );
                if( $node ){
                    $src = $node->getAttribute('src');
                    if( $src ){

                        $img = $dom->createElement('img');
                        $attrib = $dom->createAttribute( 'src' );
                        $attrib->nodeValue=$src;
                        $img->appendChild( $attrib );

                        $fig = $dom->createElement('figure');
                        $fig->appendChild( $img );

                        $node->parentNode->parentNode->replaceChild( $fig, $node->parentNode );
                    }
                }
            }
        }
        echo '<textarea cols=100 rows=10>',$dom->saveHTML(),'<textarea>';

答案 1 :(得分:0)

Laravel 5.7版本中的文本

使用Laravel的示例5.7将图像保存在$ path并替换为文本字段(文章的内容已使用base64编码的图像)查询

$change=$request->row;
    $change['text']='';
    $id=DB::table($request->name)->insertGetId($change);

    $dom = new DOMDocument('1.0');
    $dom->loadHTML($request->row['text']);
    $i=0;
    foreach ($dom->getElementsByTagName('img') as $img) {
        $src= $img->getAttribute('src');
        $image_cont = explode(",", $src);
        $path='tables/'.$request->name.'/'.$id.'/'.$i.'.png';
        Storage::disk('MyDiskDriver')->put($path, base64_decode($image_cont[1]));
        $i=$i+1;
    }
    $new=$dom->saveHTML();
    $text=preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $new);
    DB::table($request->name)->where('id', '=', $id)->update(['text' =>  $test]);

答案 2 :(得分:0)

这会将

标记替换为

标记,并保留所有标记属性:

    $content = '<p><img alt="" src="/sites/default/files/art/w2.jpg" style="height:395px; width:800px" /></p>';
    if (preg_match_all('/<img[^>]+src=["\']([^=]*)["\'][^>]*>/i', $content, $images))
    {
        $images_tags = $images[0];
        $images_srcs = $images[1];

        foreach ($images_tags[1] as $image_tag)
        {
            $content = str_replace('<p>' . $image_tag . '</p>','<figure>'.$image_tag.'"></figure>',$content);
        }
    }
    echo $content;

此代码会将

标记替换为

标记,并删除所有标记属性,但src

    $content = '<p><img alt="" src="/sites/default/files/art/w2.jpg" style="height:395px; width:800px" /></p>';
    if (preg_match_all('/<img[^>]+src=["\']([^=]*)["\'][^>]*>/i', $content, $images))
    {
        $images_tags = $images[0];
        $images_srcs = $images[1];
        $i = 0;
        foreach ($images_tags[1] as $image_tag)
        {
            $content = str_replace('<p>' . $image_tag . '</p>','<figure><img src="'.$images_srcs[$i].'"></figure>',$content);
            $i++;
        }
    }
    echo $content;