我试图弄清楚如何从jquery结果中获取HTML,同时能够在PHP中对结果进行jquery。
这是我一直在使用的当前代码
$url = 'http://www.foobar.com';
$output = file_get_contents($url);
$doc = new DOMDocument();
libxml_use_internal_errors(true); //Supress Warnings for HTML5 conversion issue
$doc->loadHTML($output);
libxml_use_internal_errors(false); //Start Showing Errors
$xpath = new DOMXpath($doc);
$CategoryString = '//tr[@class="playerSet"]';
$obj = new stdClass();
$x = 0;
foreach ($xpath->query($CategoryString) as $e) {
$x++;
$y = 0;
foreach ($e->childNodes as $child)
{
$y++;
if ($y == 1) $obj->players[$x]['name'] = $child->textContent;
if ($y == 3) $obj->players[$x]['position'] = $child->textContent;
if ($y == 5) $obj->players[$x]['team'] = $child->textContent;
if ($y == 7) $obj->players[$x]['opp'] = $child->textContent;
}
}
echo json_encode($obj);
现在,这允许我从初始查询中循环遍历子节点。 然而,我想让它更"精致",而不仅仅是做一个廉价的循环。
我将如何在$e中执行另一个 xpath-> 查询,以便我可以在 foreach 循环中循环访问这些查询?
例如,我想对 ('//td'( 进行查询,这样我就可以对初始查询结果 ($e( 的//td 的结果执行 foreach
最后,我将如何获得$child html,而不是显示$child>文本内容? 我尝试过在线搜索,但我找不到我可以使用什么来查看可能结果的快速参考。 有没有办法做一个回显来查看我可以在 $child-> 而不是 textContent 上使用的所有可能的变量? 我尝试了节点值,但我没有得到我正在寻找的结果
编辑 - 找到了一种通过函数获取 DOM 的内部 HTML 的方法,以防有人好奇
function DOMinnerHTML(DOMNode $element)
{
$innerHTML = "";
$children = $element->childNodes;
foreach ($children as $child)
{
$innerHTML .= $element->ownerDocument->saveHTML($child);
}
return $innerHTML;
}
仍在寻求有关使用示例 jquery 在$e中执行 foreach 的任何帮助。
编辑 - 为了整理,我需要对$e进行查询
的原因一个主要原因是因为在"名称"列中有时它是重复的,所以我只想通过做来获取名称......
'//td/span'
关闭主查询。 如果不对主查询的结果执行另一个 jquery 操作,我就无法做到这一点
可能有更多的列,然后只是"name",然后输出将作为JSON_ENCODE完成。 我已经更新了我的示例代码以显示更多内容。
我将解决您提出的两个问题:
1. 如何在$e外执行另一个 xpath->查询?
在原始 xpath 查询中执行此操作会更有效,如下所示:
//tr[@class="playerSet"]/td
这将为您提供具有类玩家集的 tr 父级的每个 td 的结果。
但是,如果需要,您确实可以使用某个节点作为范围进行另一个查询。DOMXPath 查询方法允许您将该节点作为第二个参数传递:
foreach ($xpath->query('//tr') as $e) {
foreach ($xpath->query('td', $e) as $child) {
echo $child->textContent;
}
}
但在这种情况下,使用 XPath 查询来获取 TR
元素的TD
子元素有点矫枉过正。使用 childNodes
属性也可以正常工作(因为表行除了 TD
元素之外不应该有任何其他子项(,并且效率更高:
foreach ($xpath->query('//tr') as $e) {
foreach ($e->childNodes as $child) {
echo $child->textContent;
}
}
2. 如何获取$child html?
使用 saveHTML 方法:
$obj->players[$x]['innerHTML'] = $doc->saveHTML($e);
您可能还感兴趣的是:
XPath 位置路径上的文档:
child::*
选择上下文节点的所有元素子元素
child::text()
选择上下文节点的所有文本节点子级
child::node()
选择上下文节点的所有子节点,无论其节点类型如何
例如,你可以玩这个:
//tr[@class="playerSet"]/child::node()
或者,如果您想遍历整个标签树(不仅是下一级别(:
//tr[@class="playerSet"]/descendant::node()