2011-01-19 10 views
2

С помощью XPath, как получить значение атрибута HREF в следующем случае (только захватывая URL, который является правильным) ?:Как получить значение атрибута href?

<a href="http://foo.com">a wrong one</a> 
<a href="http://example.com">the right one</a> 
<a href="http://boo.com">a wrong one</a> 

То есть, чтобы получить значение из href, если ссылка имеет определенный текст.

ответ

0

Я хотел бы использовать класс с открытым исходным кодом, как simple_html_dom.php

$oHtml = new simple_html_dom(); 
$oHtml->load($sBody) 
foreach($oHtml->find('a') as $oElement) { 
    echo $oElement->href 
} 
+0

Вопрос не начинается с * «С помощью XPath» *? –

4

Это будет выбирать атрибуты:

"//a[text()='the right one']/@href" 
+0

+1 Хороший, я не знал, что DOMXPath может вернуть объекты DOMAttr. :) – netcoder

+0

@netcoder спасибо .. он уверен, может :). –

+0

+1 Ответ на вопрос * "как получить значение атрибута href" * –

0

Вот полный пример использования SimpleXML:

$xml = '<html><a href="http://foo.com">a wrong one</a>' 
     . '<a href="http://example.com">the right one</a>' 
     . '<a href="http://boo.com">a wrong one</a></html>'; 
$tree = simplexml_load_string($xml); 
$nodes = $tree->xpath('//a[text()="the right one"]'); 
$href = (string) $nodes[0]['href']; 
+2

Используйте [. = "Правое"], чтобы [текст() = "правильный"]. Потому что он короче и потому, что в значении могут быть комментарии, которые бы разбивали его на несколько текстовых узлов. –

+0

+1 для полезного предложения – scoffey

+0

Но это выбирает элементы 'a', а не' @ href'. –

1

я думаю, что это лучшее решение, вы можете использовать каждый из них в качестве элемента массива

$String= ' 
<a href="http://foo.com">a wrong one</a> 
<a href="http://example.com">the right one</a> 
<a href="http://boo.com">a wrong one</a> 
      '; 

$array=get_all_string_between($String,'href="','">'); 
print_r($array);//just to see what is inside the array 

//now get each of them 
foreach($array as $value){ 
echo $value.'<br>'; 
} 

function get_all_string_between($string, $start, $end) 
{ 
    $result = array(); 
    $string = " ".$string; 
    $offset = 0; 
    while(true) 
    { 
     $ini = strpos($string,$start,$offset); 
     if ($ini == 0) 
      break; 
     $ini += strlen($start); 
     $len = strpos($string,$end,$ini) - $ini; 
     $result[] = substr($string,$ini,$len); 
     $offset = $ini+$len; 
    } 
    return $result; 
} 
+0

Действительно? Строка между? Менее полезно, чем синтаксический анализ с помощью RegExp? –

+0

Это идеальный ответ, который решил мою проблему. –

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