替换 <img> 标签上的空 alt 标签

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

我想替换字符串中图像上的空 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?
                    }
                }

            }
        }

我不知道必须完成代码,我认为必须有一个更简单的解决方案。有建议吗?

php image preg-match-all
5个回答
2
投票

使用

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

2
投票

也许你可以使用 Javascript 和 jquery 来完成这类事情 喜欢:

$('img').each(function(){
    $(this).attr('alt', $(this).attr('title'));
});

希望有帮助

问候。


2
投票

您想要的是一个 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();

0
投票

您可以使用

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');
}

?>

0
投票

请尝试以下:

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);
© www.soinside.com 2019 - 2024. All rights reserved.