使用 getimagesize() 向 <img> 标签添加高度属性

问题描述 投票:0回答:2

我想更改我的

post_content
字符串,以便所有
<img>
标签都具有高度属性,该属性的值源自图像。

`preg_match_all 不适合我的需求。

我已经尝试过

preg_filter()
,但无法在替换参数中调用函数。

getimagesize(IMGURL)[1]
是高度尺寸像素。

$2
旨在成为替换字符串中的 img 标签 src URL。

preg_filter(
    '/<img(.+?)src="(.+?)"(.+?)>/i',
    "<img$1src=\"$2\"$3 height=\"" . getimagesize("{$2}")[1] . "\">",
    $row['post_content']
);

// <img src="/abc/a.jpg" height="">

preg_filter(
    '/<img(.+?)src="(.+?)"(.+?)>/i',
    "<img$1src=\"$2\"$3 height=\"".getimagesize(."{$2}".)[1]."\">",
    $row['post_content']
);

// PHP Parse error:  syntax error, unexpected '.' in /var/www/a/a.php line 22

我的输入字符串声明:

$row['post_content'] = <<<HTML
<p>Hello my name is.</p>
<img src="sadsafdsd.jpg" alt><br>
<img src="sadsafdsfd.jpg" alt><br>
<img src="sadsgtjhsad.jpg" alt><br>
<img src="hgtsadsad.jpg" alt><br>
<img src="sadshtread.jpg" width="400" alt><br>
<img src="sadretsad.jpg" alt><br>
HTML;
php html image replace
2个回答
1
投票

您可以使用 preg_replace_callback() 代替。

function setheight($matches){
    $img_prop = getimagesize($matches[2]);
    return '<img' . $matches[1] . 'src="'.$matches[2].'" '. $matches[3] . ' height="'.$img_prop[2].'">';
}

preg_replace_callback(
            "/<img(.+?)src=\"(.+?)\"(.+?)>/i",
            "setheight",
            $row['post_content']);

0
投票
  1. preg_filter()
    不会通过引用修改字符串。您的代码片段没有使用函数的返回值,我认为解释变异值是由函数返回的很重要。

  2. 如果您想使用正则表达式替换某些内容,并且如果没有替换,您想将字符串减少为
  3. preg_filter()

    ,则

    null
    适合调用字符串。另请参阅:preg_replace() 与 preg_filter()

  4. 使用正则表达式处理可解析的 HTML 不太可靠、经常被忽视且不太直观。请改用原生 DOM 解析库,例如 DOMDocument。 DOMDoument 类提供了不言自明的方法名称和比正则表达式更准确的结果。

  5. 因为您的输入字符串缺少父(包含)元素(子元素需要父元素),您可以临时将字符串包装在基本 div 标签中,执行更改,然后删除 div 标签以防止解析器做出假设关于如何纠正您的内容。

代码:(演示

$row['post_content'] = <<<HTML
<p>Hello my name is.</p>
<img src="sadsafdsd.jpg" alt><br>
<img src="sadsafdsfd.jpg" alt><br>
<img src="sadsgtjhsad.jpg" alt><br>
<img src="hgtsadsad.jpg" alt><br>
<img src="sadshtread.jpg" width="400" alt><br>
<img src="sadretsad.jpg" alt><br>
HTML;

// spoof native function for demo
function _getimagesize($src) {
    return [0, 100];
}

$dom = new DOMDocument();
$dom->loadHTML("<div>{$row['post_content']}</div>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
foreach ($dom->getElementsByTagName("img") as $img) {
    $img->setAttribute(
        'height',
        getimagesize(
            $img->getAttribute('src')
        )[1]
    );
}
echo substr($dom->saveHTML(), 5, -7);

输出:

<p>Hello my name is.</p>
<img src="sadsafdsd.jpg" alt height="100"><br>
<img src="sadsafdsfd.jpg" alt height="100"><br>
<img src="sadsgtjhsad.jpg" alt height="100"><br>
<img src="hgtsadsad.jpg" alt height="100"><br>
<img src="sadshtread.jpg" width="400" alt height="100"><br>
<img src="sadretsad.jpg" alt height="100"><br>
© www.soinside.com 2019 - 2024. All rights reserved.