PHP Xpath:获取所有包含“字母”的href


PHP Xpath: Get all href's that contain "letter"

假设我有一个已加载的html文件,我运行此查询:

$url = 'http://www.fangraphs.com/players.aspx';
$html = file_get_contents($url);    
$myDom = new DOMDocument;
$myDom->formatOutput = true;
@$myDom->loadHTML($html);
$anchor = $xpath->query('//a[contains(@href,"letter")]');

这给了我一个这些锚点的列表,如下所示:

<a href="players.aspx?letter=Aa">Aa</a>

但我需要一种方法来只得到"玩家.aspx?字母=Aa"。

我想我可以尝试:

$anchor = $xpath->query('//a[contains(@href,"letter")]/@href');

但这给了我一个php错误,说当我尝试以下内容时,我无法附加节点:

$xpath = new DOMXPath($myDom);
$newDom = new DOMDocument;
$j = 0;
while( $myAnchor = $anchor->item($j++) ){
   $node = $newDom->importNode( $myAnchor, true );    // import node
   $newDom->appendChild($node);
}

知道如何仅获取第一个查询选择的 href 标签的值吗?谢谢!

使用

//a/@href[contains(., 'letter')]

这将选择字符串值(属性的(包含字符串"letter"的任何a的任何href属性

XPath 查询返回属性本身(即DOMAttr对象(而不是元素(即DOMElement对象(。这很好,这似乎是您想要的,但是将它们附加到文档中是问题所在。DOMAttr不是文档树中的独立节点;它与DOMElement有关,但不是通常意义上的孩子。因此,直接将DOMAttr附加到文档是无效的。

从 W3C 规范:

Attr对象继承Node接口,但由于它们实际上不是它们所描述的元素的子节点,因此 DOM 不认为它们是文档树的一部分。DOM 认为属性是元素的属性,而不是与它们关联的元素具有单独的标识

要么将DOMAttrDOMElement关联并附加该元素,要么提取DOMAttr的值并根据需要使用它。

若要仅追加其纯文本值,请在DOMText节点中使用其值并追加该值。例如,更改此行:

    $newDom->appendChild($node);

对此:

    $newDom->appendChild(new DOMText($node->value));

试试这个。

$xml_string = 'your xml string';
$xml = simplexml_load_string($xml_string);
foreach($xml->a[0]->attributes() as $href => $value) {
    $myAnchorsValues[] = $value;
}
var_dump($myAnchorsValues);