PHP Xpath : get all href values that contain needle

后端 未结 1 703
逝去的感伤
逝去的感伤 2020-12-14 08:47

Working with PHP Xpath trying to quickly pull certain links within a html page.

The following will find all href links on mypage.html: $nodes = $x->query(\"//a

1条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-14 09:14

    Not sure I understand the question correctly, but the second XPath expression already does what you are describing. It does not match against the text node of the A element, but the href attribute:

    $html = <<< HTML
    
    HTML;
    
    $xml  = simplexml_load_string($html);
    $list = $xml->xpath("//a[contains(@href,'foo')]");
    

    Outputs:

    array(1) {
      [0]=>
      object(SimpleXMLElement)#2 (2) {
        ["@attributes"]=>
        array(1) {
          ["href"]=>
          string(31) "http://example.com/page?foo=bar"
        }
        [0]=>
        string(11) "Description"
      }
    }
    

    As you can see, the returned NodeList contains only the A element with href containing foo (which I understand is what you are looking for). It contans the entire element, because the XPath translates to Fetch all A elements with href attribute containing foo. You would then access the attribute with

    echo $list[0]['href'] // gives "http://example.com/page?foo=bar"
    

    If you only want to return the attribute itself, you'd have to do

    //a[contains(@href,'foo')]/@href
    

    Note that in SimpleXml, this would return a SimpleXml element though:

    array(1) {
      [0]=>
      object(SimpleXMLElement)#3 (1) {
        ["@attributes"]=>
        array(1) {
          ["href"]=>
          string(31) "http://example.com/page?foo=bar"
        }
      }
    }
    

    but you can output the URL now by

    echo $list[0] // gives "http://example.com/page?foo=bar"
    

    0 讨论(0)
提交回复
热议问题