我想更改我的
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;
您可以使用 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']);
preg_filter()
不会通过引用修改字符串。您的代码片段没有使用函数的返回值,我认为解释变异值是由函数返回的很重要。
preg_filter()
,则
null
适合调用字符串。另请参阅:preg_replace() 与 preg_filter()
使用正则表达式处理可解析的 HTML 不太可靠、经常被忽视且不太直观。请改用原生 DOM 解析库,例如 DOMDocument。 DOMDoument 类提供了不言自明的方法名称和比正则表达式更准确的结果。
因为您的输入字符串缺少父(包含)元素(子元素需要父元素),您可以临时将字符串包装在基本 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>