使用所有属性重新打印<img/>标记

时间:2017-03-31 12:47:32

标签: php arrays image multidimensional-array

我正在修改我制作的WordPress插件,该插件指定缺少height和/或<img>属性的图片尺寸。

正如您在current version on GitHub中看到的,我手动列出了$attributes代码(L38)的所有属性。但是,如果用户要添加自定义属性,它将被省略,因为它未列在我的# Before <img src="http://example.com/img.png" class="img" data-sample="test"> # After <img src="http://example.com/img.png" class="img" width="100" height="30"> 变量中:

<img>

创建一个简单的测试文件,我能够更新正则表达式以存储preg_match_all( '/(?:<img|(?<!^)\G)\h*([-\w]+)="([^"]+)"(?=.*?\/>)/', $content, $images ); 标记中的所有属性。是的,我知道使用DOMDocument的建议,但它在过去引起了更多WordPress问题。

var_dump( $images );

为了不用太多代码填写这篇文章,我有当前正在运行的测试文件on my GitHub Gist here

使用...,这为我提供了示例图像的以下输出(我在每个数组的末尾添加了 0 => array (size=19) 0 => string '<img src="https://placehold.it/250x100/99cc00/000.jpg?text=JPG"' (length=63) 1 => string ' alt="JPG"' (length=10) 2 => string '<img src="https://placehold.it/250x100.gif?text=GIF"' (length=52) ... 1 => array (size=19) 0 => string 'src' (length=3) 1 => string 'alt' (length=3) 2 => string 'src' (length=3) ... 2 => array (size=19) 0 => string 'https://placehold.it/250x100/99cc00/000.jpg?text=JPG' (length=52) 1 => string 'JPG' (length=3) 2 => string 'https://placehold.it/250x100.gif?text=GIF' (length=41) ... 以节省空间):

foreach ( $images[1] as $attributes[1] => $value ) {
    echo( '< img ' . $value . '="' . 'value' . '" ><br>' );
}

我的目标是在计算维度后重新创建包含所有属性和值的图像标记。从我的测试中,我尝试了以下内容,但它没有给我我期待的结果:

timer

1 个答案:

答案 0 :(得分:1)

您的密码:

$content = <<<EOT
<p>List of sample images.</p>
<img src="https://placehold.it/250x100/99cc00/000.jpg?text=JPG" alt="JPG" /><br>
<img src="https://placehold.it/250x100.gif?text=GIF" alt="GIF" /><br>
<img src="https://placehold.it/250x100/ff6600/000.png?text=PNG" alt="PNG" /><br>
<img class="no-ext" src="https://placehold.it/350x150?text=No Extension" alt="No Ext" /><br>
<img src="https://placehold.it/250x100.png" custom-attr="custom1" another-attr="custom2" /><br>
<img class="svg" src="https://upload.wikimedia.org/wikipedia/commons/0/02/SVG_logo.svg" alt="SVG" /><br>
<img class="webp" src="https://gstatic.com/webp/gallery/1.webp" width="100" alt="webP" /><br>
EOT;
# Find all content with <img> tags
preg_match_all( '/(?:<img|(?<!^)\G)\h*([-\w]+)="([^"]+)"(?=.*?\/>)/', $content, $images );
foreach ( $images[1] as $attributes[1] => $value ) {
    echo( '< img ' . $value . '="' . 'value' . '" ><br>' );
}

解决方案:

//echo "<pre>"; print_r($images);
$temp = array();
foreach($images[0] as $key=>$img){    
    $pos = strpos($img,'<img');
    if($pos === false){
        $temp[$key_2][] = $img;
    }else{
        $temp[$key][] = $img;
        $key_2 = $key;
    }
}
foreach($temp as $k=>$v){
    $str[] = implode(' ', $v) . ' />';
}

$finalStr = implode('<br />', $str);

echo $finalStr;

Click here to check output