测试loadHTML($ str)的内容

时间:2016-11-11 22:26:50

标签: php

现在,下面的代码对html文档执行测试,以查看是否有任何h1或h2标记包含字符串$ title。代码完美无缺。

    $s1='random text';
    $a1='random anchor text';
    $href1='http://www.someurl.com';
    $document = new DOMDocument();
    $libxml_previous_state = libxml_use_internal_errors(true);
    $document->loadHTML($str);
    libxml_use_internal_errors($libxml_previous_state);

    $tags = array ('h1', 'h2');
    $texts = array ();
    foreach($tags as $tag)
    {
        $elementList = $document->getElementsByTagName($tag);
        foreach($elementList as $element)
        {
            $texts[$element->tagName] = strtolower($element->textContent);
        }
    }

    if(in_array(strtolower($title),$texts)) {
        echo '<div class="success"><i class="fa fa-check-square-o" style="color:green"></i> This article used the correct title tag.</div>';
    } else {
        echo '<div  class="error"><i class="fa fa-times-circle-o" style="color:red"></i> This article did not use the correct title tag.</div>';
    }

我需要再运行三个测试,首先我需要扫描文档是否存在$ s1,但是无法解决这个问题。使用工作代码,它正在寻找h1或h2标签内的完全匹配。然而,对于$ s1我并不寻找完全匹配,只是文本存在的任何地方 - 无论是否被其他文本包围。

然后我需要另一个完全匹配测试来查找“a”文本中的$ a1,我还需要测试href是否存在$ href1。

我不确定如何进行这些测试。我相信我可以得到$ a1测试,因为它只是另一个完全匹配,但不知道如何进行href测试,也不知道如何扫描字符串,可能被其他文本包围。

希望这一切都有意义。

更新

我需要一个解决方案,允许我回显单个“是字符串存在”或“不存在不存在”。类似于当前测试回声的方式,而不是每个循环。每次测试我都需要这样做一次。

示例结果如下:

yes $s1 is in the document
no $s1 is not in the document
yes $href1 is an href in the document
no $href1 is not an href in the document
yes $a1 is an anchor text in the document
no $a1 is not an anchor text in the document

我也相信我应该使用substr()但我不确定如何。

希望得到一些工作实例和详细解释。

1 个答案:

答案 0 :(得分:1)

这是从所有文本节点中提取(1)锚点href(2)锚文本(3)h1 text(4)h2 text(5)文本片段并将它们存储在数组中的代码。之后,它会在这些数组中搜索相同的精确/部分匹配。

我们使用xquery做到了,因为使用它从叶节点中提取文本似乎更容易。

<强>代码:

<?php
    /* returns true if an exact match for $str is found in items of $arr array */
    function find_exact($str, array $arr) {
      foreach ($arr as $i) {if (!strcasecmp($i,$str)) {return(true);}}
      return(false);
    }

    /* returns true if a partial/exact match for $str is found in items of $arr array */
    function find_within($str, array $arr) {
      foreach ($arr as $i) {if (stripos($i,$str)!==false) {return(true);}}
      return(false);
    }

    $s1='random text';
    $a1='random anchor text';
    $href1='http://www.someurl.com';
    $document = new DOMDocument();
    $libxml_previous_state = libxml_use_internal_errors(true);

    /* Sample document. Just for testing */
    $str=<<<END_OF_DOC
<h1>abc h1title def</h1>
<h2>h2title</h2>
<div>some random text here</div>
<div>two</div>three
<a href='http://www.someurl.com'>some random anchor text here</a>
<span>four</span>five<span>six<b>boldscript</b></span>
END_OF_DOC;

    $document->loadHTML($str);
    libxml_use_internal_errors($libxml_previous_state);

    /* We extract the texts into these arrays, for matching later */
    $a_texts=array(); $a_hrefs=array(); $h1_texts=array(); $h2_texts=array(); $all_texts=array();

    /* We use XPath because it seems easier for extracting text nodes */
    $xp = new DOMXPath($document); $eList=$xp->query("//node()");
    foreach ($eList as $e) {
      //print "Node {".$e->nodeName."} {".$e->nodeType."} {".$e->nodeValue."} {".$e->textContent."}<br/>";
      if (!strcasecmp($e->nodeName,"a")) { array_push($a_texts,$e->textContent);array_push($a_hrefs,$e->getAttribute("href")); }
      if (!strcasecmp($e->nodeName,"h1")) {array_push($h1_texts,$e->textContent);}
      if (!strcasecmp($e->nodeName,"h2")) {array_push($h2_texts,$e->textContent);}
      if ($e->nodeType === XML_TEXT_NODE) {array_push($all_texts,$e->textContent);}
    }

    //var_dump($a_texts); print("<br/>"); var_dump($a_hrefs); print("<br/>"); var_dump($h1_texts); print("<br/>");
    //var_dump($h2_texts);print("<br/>");var_dump($all_texts);print("<br/>");

    if (find_within($s1,$all_texts)) { print "yes $s1 is in the document<br/>"; }
    else { print "no $s1 is not in the document<br/>"; }

    if (find_exact($href1,$a_hrefs)) { print "yes $href1 is an href in the document<br/>"; }
    else { print "no $href1 is not an href in the document<br/>"; }

    if (find_within($a1,$a_texts)) { print "yes $a1 is an anchor text in the document<br/>"; }
    else { print "no $a1 is not an anchor text in the document<br/>"; }
?>

<强>结果:

yes random text is in the document
yes http://www.someurl.com is an href in the document
yes random anchor text is an anchor text in the document