我想替换字符串中图像上的空 alt 标签。我有一个字符串,其中包含窗帘页的所有文本。文本中也有图像,其中很多都有空标签(旧数据),但大多数时候它们都有标题标签。 例如:
<img src="assets/img/test.png" alt="" title="I'am a title tag" width="100" height="100" />
我希望拥有什么:
<img src="assets/img/test.png" alt="" title="I'am a title tag" alt="I'am a title tag" width="100" height="100" />
所以: 我需要找到字符串中的所有图像,循环遍历图像,找到标题标签,找到 alt 标签,然后将空的 alt 标签替换为具有值的标题标签。
这就是我尝试过的:
preg_match_all('/<img[^>]+>/i',$return, $text);
if(isset($text)) {
foreach( $text as $itemImg ) {
foreach( $itemImg as $item ) {
$array = array();
preg_match( '/title="([^"]*)"/i', $item, $array );
if(isset($array[1])) {
//So $array[1] is a title tag, now what?
}
}
}
}
我不知道必须完成代码,我认为必须有一个更简单的解决方案。有建议吗?
使用
Regex
不是一个好方法,您应该使用 DOMDocument
来解析 HTML
。这里我们查询那些 alt
属性为空的元素,这实际上是有问题的。
<?php
ini_set('display_errors', 1);
$string=<<<HTML
<img src="assets/img/test1.png" alt="" title="I'am a title tag" width="100" height="100" />
<img src="assets/img/test2.png" alt="" title="I'am a title tag" width="100" height="100" />
<img src="assets/img/test3.png" alt="" title="I'am a title tag" width="100" height="100" />
HTML;
$domDocument = new DOMDocument();
$domDocument->loadHTML($string,LIBXML_HTML_NODEFDTD);
$domXPath = new DOMXPath($domDocument);
$results = $domXPath->query('//img[@alt=""]');
foreach($results as $result)
{
$title=$result->getAttribute("title");
$result->setAttribute("alt",$title);
echo $domDocument->saveHTML($result);
echo PHP_EOL;
}
也许你可以使用 Javascript 和 jquery 来完成这类事情 喜欢:
$('img').each(function(){
$(this).attr('alt', $(this).attr('title'));
});
希望有帮助
问候。
您想要的是一个 HTML 解析器库,可以操作 HTML,然后再次保存它。通过使用正则表达式来修改 HTML 标记,您将陷入混乱。
PHP 中内置的 DOM 模块提供了此功能:http://php.net/manual/en/book.dom.php
这是一个例子(抄袭自本文):
$dom = new DOMDocument;
$dom->loadHTML($html);
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
$image->setAttribute('src', 'http://example.com/' . $image->getAttribute('src'));
}
$html = $dom->saveHTML();
您可以使用
DOMDocument
来实现您的要求。以下是示例代码之一供您参考:
<?php
$html = '<a href="http://example.com" rel="nofollow external">test</a>';
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//a[contains(concat(' ', normalize-space(@rel), ' '), ' external ')]");
foreach($nodes as $node) {
$node->setAttribute('href', 'http://example.org');
}
?>
请尝试以下:
function img_title_in_alt($full_img_tag){
$doc = new DOMDocument();
$doc->loadHTML($full_img_tag);
$imageTags = $doc->getElementsByTagName('img');
foreach($imageTags as $tag) {
if($tag->getAttribute('src')!==''){
return '<img src="'.$tag->getAttribute('src').'" width="'.$tag->getAttribute('width').'" height="'.$tag->getAttribute('height').'" alt="'.$tag->getAttribute('title').'" title="'.$tag->getAttribute('title').'" />';
}
}
}
现在使用图像的完整 html 标签调用该函数。看例子:
$image = '<img src="assets/img/test.png" alt="" title="I\'am a title tag" width="100" height="100" />';
print img_title_in_alt($image);