2017-01-05 17 views
-1

У меня есть строкаИзвлечь текст между первым <a> тегом

$str = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 
tempor <a href="http://example2.com">Do not want this text</a> incididunt ut labore et <a href="http://example.com">Want this text</a> dolore magna aliqua. Ut enim ad  minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 
consequat. Duis aute irure dolor in <a href="http://example.com">Do not want this text</a> reprehenderit in voluptate velit esse 
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; 

Как извлечь текст между первым экземпляром тега, который ссылается на http://example.com? Мне не нужен текст, который ссылается на http://example2.com или текст во второй ссылке, которая ссылается на http://example.com.

Я хочу вернуть «Хочу этот текст». есть идеи как это сделать?

Спасибо!

+2

Возможный дубликат [Regex PHP, матч все ссылки с определенным текстом] (http://stackoverflow.com/questions/1661179/regex-php-match-all-links-with-specific-text) – yivi

ответ

-1

Использование preg_match()

Пример:

$string = '<a href="http://example2.com">Do not want this text</a> incididunt ut labore et <a href="http://example.com">Want this text</a> '; 

if (preg_match('/<\s*a[^<>]*>([^<>]+)</a>/i', $string, $matches)) { 
     var_dump($matches); 
} 
+3

[вы не должны использовать регулярное выражение для анализа HTML] (http://stackoverflow.com/questi ons/590747/using-regular-expressions-to-parse-html-why-not) –

+0

И почему? – malutki5200

+0

@ malutki5200 в случае, если вы не заметили [ссылка] (http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not) * mister martin *, используемый в комментарий, вы должны прочитать ответы (и комментарии) на [вопрос] (http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not) –

0

Вы можете сделать это с помощью регулярных выражений, например:

\<a href=\"http:\/\/example.com\".*\>(.*?)\<\/a\> 

фрагмент кода:

$str = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 
tempor <a href="http://example2.com">Do not want this text</a> incididunt ut labore et <a href="http://example.com">Want this text</a> dolore magna aliqua. Ut enim ad  minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 
consequat. Duis aute irure dolor in <a href="http://example.com">Do not want this text</a> reprehenderit in voluptate velit esse 
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; 

$regex = '/\<a href=\"http:\/\/example.com\".*\>(.*?)\<\/a\>/g'; 
preg_match($regex, $str, $matches); 

В $ соответствует Вы будете найдите нужный результат.

+1

[вы должны " t использовать регулярное выражение для анализа HTML] (http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not) –

+0

@mistermartin путь быстрее и менее жуткий, чем DomDocument ... As так как вам не нужно разбирать весь файл, регулярное выражение лучше. – Blaatpraat

2

Вы можете, скорее всего, достичь своей цели, используя DOMDocument - в сочетании с DOMXPath для более сложных требований.

$dom=new DOMDocument; 
$dom->loadHTML($str); 

$col=$dom->getElementsByTagName('a'); 
if(!empty($col)){ 
    foreach($col as $node)echo $node->nodeValue; 
} 
1

Вам необходимо использовать DomDocument. DomDocument позволяет использовать PHP для взаимодействия с HTML-страницей с помощью объектной модели документа.

$dom = new DomDocument; 
$dom->loadHTML(file_get_contents($url)); 
$dom->preserveWhiteSpace = false; //remove unnecessary whitespace 
$links = $dom->getElementsByTagName('a'); 

На данный момент у вас есть массив объектов. Каждый объект, по существу, является ElementNode с тегом a.

Предполагая, что вы хотите получить текст первой ссылки, вы бы тогда сделать: $text = $links[0]->nodeValue;

Однако, если вы вместо того, чтобы текст, который соответствует ссылке «http://example.com», то вы могли бы сделать :

foreach ($links as $link) 
{ 
    if($link->attributes->href == "http://example.com") { 
    $text = $link->nodeValue; 
}