我使用的是PHP简单的DOM解析器,但它似乎没有搜索文本的功能。我需要搜索一个字符串并找到它的父ID。基本上与正常使用相反。
任何人都知道怎么做?
答案 0 :(得分:8)
$html = file_get_html('http://www.google.com/');
$eles = $html->find('*');
foreach($eles as $e) {
if(strpos($e->innertext, 'theString') !== false) {
echo $e->id;
}
}
答案 1 :(得分:4)
想象一下,任何标签都有“明文”属性并使用标准属性选择器。
所以,HTML:
<div id="div1">
<span>London is the capital</span> of Great Britain
</div>
<div id="div2">
<span>Washington is the capital</span> of the USA
</div>
可以想象成:
<div id="div1" plaintext="London is the capital of Great Britain">
<span plaintext="London is the capital ">London is the capital</span> of Great Britain
</div>
<div id="div2" plaintext="Washington is the capital of the USA">
<span plaintext="Washington is the capital ">Washington is the capital</span> of the USA
</div>
PHP解决你的任务只是:
<?php
$t = '
<div id="div1">
<span>London is the capital</span> of Great Britain
</div>
<div id="div2">
<span>Washington is the capital</span> of the USA
</div>';
$html = str_get_html($t);
$foo = $html->find('span[plaintext^=London]');
echo "ID: " . $foo[0]->parent()->id; // div1
?>
(请记住,<span>
标签的“明文”用空格符号右边填充;这是简单HTML DOM的默认行为,由常量DEFAULT_SPAN_TEXT
定义
答案 2 :(得分:3)
得到了答案。整个例子有点长但是有效。我也展示了输出。
我们将要查看的HTML:
<html>
<head>
<title>Simple HTML DOM - Find Text</title>
</head>
<body>
<h3>Simple HTML DOM - Find Text</h3>
<div id="first">
<p>This is a paragraph inside of div 'first'.
This paragraph does not have the text we are looking for.</p>
<p>As a matter of fact this div does not have the text we are looking for</p>
</div>
<div id="second">
<ul>
<li>This is an unordered list.
<li id="love1">We are looking for the following word love.
<li>Does not contain the word.
</ul>
<p id="love2">This paragraph which is in div second contains the word love.</p>
</div>
<div id="third">
<a id="love3" href="goes.nowhere.com">link to love site</a>
</div>
</body>
</html>
PHP:
<?php
include_once('simple_html_dom.php');
function scraping_for_text($iUrl,$iText)
{
echo "iUrl=".$iUrl."<br />";
echo "iText=".$iText."<br />";
// create HTML DOM
$html = file_get_html($iUrl);
// get text elements
$aObj = $html->find('text');
if (count($aObj) > 0)
{
echo "<h4>Found ".$iText."</h4>";
}
else
{
echo "<h4>No ".$iText." found"."</h4>";
}
foreach ($aObj as $key=>$oLove)
{
$plaintext = $oLove->plaintext;
if (strpos($plaintext,$iText) !== FALSE)
{
echo $key.": text=".$plaintext."<br />"
."--- parent tag=".$oLove->parent()->tag."<br />"
."--- parent id=".$oLove->parent()->id."<br />";
}
}
// clean up memory
$html->clear();
unset($html);
return;
}
// -------------------------------------------------------------
// test it!
// user_agent header...
ini_set('user_agent', 'My-Application/2.5');
scraping_for_text("test_text.htm","love");
?>
输出:
iUrl=test_text.htm
iText=love
Found love
18: text=We are looking for the following word love.
--- parent tag=li
--- parent id=love1
21: text=This paragraph which is in div second contains the word love.
--- parent tag=p
--- parent id=love2
25: text=link to love site
--- parent tag=a
--- parent id=love3
这就是他们写的所有!!!!
答案 3 :(得分:2)
$d = new DOMDocument();
$d->loadXML($xml);
$x = new DOMXPath($d);
$result = $x->evaluate("//text()[contains(.,'617.99')]/ancestor::*/@id");
$unique = null;
for($i = $result->length -1;$i >= 0 && $item = $result->item($i);$i--){
if($x->query("//*[@id='".addslashes($item->value)."']")->length == 1){
echo 'Unique ID is '.$item->value."\n";
$unique = $item->value;
break;
}
}
if(is_null($unique)) echo 'no unique ID found';