2010-03-06 4 views
16

Работа с PHP Xpath пытается быстро вывести определенные ссылки на странице html.PHP Xpath: получить все значения href, содержащие иглу

Ниже представлены все HREF ссылки на mypage.html: $nodes = $x->query("//a[@href]");

Принимая во внимание следующее будет найти все HREF ссылки, где описание соответствует моей иглы: $nodes = $x->query("//a[contains(@href,'click me')]");

То, что я пытаюсь добиться соответствия на самом href, более конкретном поиске url, который содержит определенные параметры. Возможно ли это в запросе Xpath или я должен просто начать обработку вывода из первого запроса Xpath?

+0

Да, но поиск «иглы» возвращает текстовую часть в * $ node-> nodeValue(); * и не желаемый * http: //example.com? Param = needle * ...? – MattW

ответ

35

Не уверен, что я правильно понял вопрос, но второе выражение XPath уже делает то, что вы описываете. Это не соответствует против текстового узла элемента, но HREF атрибута:

$html = <<< HTML 
<ul> 
    <li> 
     <a href="http://example.com/page?foo=bar">Description</a> 
    </li> 
    <li> 
     <a href="http://example.com/page?lang=de">Description</a> 
    </li> 
</ul> 
HTML; 

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

Выходы:

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

Как вы можете видеть, возвращаемый NodeList содержит только элемент с HREF, содержащий foo (я понимаю, это то, что вы ищете). Он связывает весь элемент, потому что XPath переводится в . Извлеките все элементы A с атрибутом href, содержащим foo. Затем вы должны иметь доступ к атрибуту с

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

Если вы хотите, чтобы вернуть атрибуту себя, вы должны были бы сделать

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

Обратите внимание, что в SimpleXML, это будет возвращать элемент SimpleXml хотя:

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

но вы можете выводить URL сейчас,

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

вот что я имел в виду. Только мой html-документ выходит из строя при использовании SimpleXML. Однако запрос xpath работает, и использование его с DomXpath дает мне то, что я хочу. Благодаря! – MattW

Смежные вопросы