替换& lt; img>使用PHP和DOMDocument标记


Replace <img> tag using PHP and 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);
        }

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

我尝试了以下操作,似乎产生了所需的结果。我发现,当其他方法失败时,在删除/修改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>';

这将取代<带有><数字>标签并保留所有标签属性:

    $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;

ПримердляLaravel 5.7ссохранениемкартинкипо美元路径изаменынанеговполе文本(содержаниестатьискартинкамиbase64)запроса

示例5.7使用Laravel将图像保存在$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]);