现在,下面的代码对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()但我不确定如何。
希望得到一些工作实例和详细解释。
答案 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