1

我想检查一个<img>标签是否有alt=""文本,还需要在 DOM 中找到 img 标签的行号。目前,我编写了以下代码,但一直在寻找行号。例如:

$doc = new DOMDocument();
$doc->loadHTMLFile('http://www.google.com');
$htmlElement = $doc->getElementsByTagName('html');
$tags = $doc->getElementsByTagName('img');
echo $tags->item(0)->getLineNo();
foreach ($tags as $image) {
    // Get sizes of elements via width and height attributes
    $alt = $image->getAttribute('alt');
    if($alt == ""){
       $src = $image->getAttribute('src'); 
       echo "No alt text ";  
      echo '<img src="http://google.com/'.$src.'" alt=""/>'. '<br>';
    }
    else{
       $src = $image->getAttribute('src'); 
         echo '<img src="http://google.com/'.$src.'" alt=""/>'. '<br>';            
    }             
}

目前,从上面的代码中,我得到的图像和文字在图像旁边显示“没有替代文字”,但我想获得 img 标签出现的行号。例如这里的行号是 57,

56. <div class="work_item">
57. <p class="pich"><img src="images/works/1.jpg"    alt=""></p>
58. </div>
4

3 回答 3

1

使用DOMNode::getLineNo(),例如$line = $image->getLineNo()

于 2012-12-30T16:20:34.217 回答
0

HTML 没有行号的真正概念,因为它们只是空格。

考虑到这一点,您可能能够计算目标节点之前的所有文本节点中有多少换行符。你也许可以用 DOMXPath 做到这一点:

$xpath = new DOMXPath($doc);
$node = /* your target node */;
$textnodes = $xpath->query("./preceding::*[contains(text(),'\n')]",$node);
$line = 1;
foreach($textnodes as $textnode) $line += substr_count($textnode->textContent,"\n");
// $line is now the line number of the node.

请注意,我没有对此进行测试,也从未在 xpath 中使用过轴。

于 2012-12-30T04:24:01.797 回答
0

我想我已经弄清楚了我想要实现的目标,但不确定这是正确的方法。它正在做这项工作。请留下评论或任何其他想法,我该如何改进它。如果您访问以下站点并键入任何 URL。它将在网页中生成包含可访问性问题的报告。它是一个可访问性检查工具。

http://valet.webthing.com/page/

我要做的就是实现这种布局。下面的代码将生成所提供 URL 的 DOM,并查找任何没有替代文本的图像标签。

<html>
<body>
    <?php
    $dom = new domDocument;
// load the html into the object
    $dom->loadHTMLFile('$yourURLAddress');
// keep white space
    $dom->preserveWhiteSpace = true;
// nicely format output
    $dom->formatOutput = true; 
    $new = htmlspecialchars($dom->saveHTML(), ENT_QUOTES);
    $lines = preg_split('/\r\n|\r|\n/', $new); //split the string on new lines
    echo "<pre>";
    //find 'alt=""' and print the line number and html tag
    foreach ($lines as $lineNumber => $line) {

        if (strpos($line, htmlspecialchars('alt=""')) !== false) {
            echo "\r\n" . $lineNumber . ". " . $line;
        }
    }
    echo "\n\n\nBelow is the whole DOM\n\n\n";
    //print out the whole DOM including line numbers
    foreach ($lines as $lineNumber => $line) {
        echo "\r\n" . $lineNumber . ". " . $line;
    }
    echo "</pre>";
    ?>   
 </body> 
</html>

我要感谢所有特别帮助“chwagssd”和迈克约翰逊的人。

于 2012-12-31T06:19:51.810 回答