2015-08-15 3 views
-2

Как разобрать содержимое внутри этих тегов, предполагая, что ссылка динамическая?Получение текста ссылки с регулярными выражениями

<h3 class="lvtitle"> 
<a href="http://www.ebay.com/itm/Chicago-Chicago-XXX-Audio-CD-/351478948979?hash=item51d5c72473" 
class="vip" title="Click this link to access Chicago, Chicago XXX Audio CD"> 
Chicago, Chicago XXX Audio CD 
</a> 
</h3> 

Что мне нужно, так это получение части «Чикаго, Чикаго XXX Audio CD».

+0

Пытался что-нибудь? – anubhava

+1

use html parsers –

+0

Да, я попробовал полезную функцию для получения строк между тегами, но в этом случае это действительно не работает. –

ответ

3

Parser пример:

$string = '<h3 class="lvtitle"><a href="http://www.ebay.com/itm/Chicago-Chicago-XXX-Audio-CD-/351478948979?hash=item51d5c72473" class="vip" title="Click this link to access Chicago, Chicago XXX Audio CD">Chicago, Chicago XXX Audio CD</a></h3>'; 
$doc = new DOMDocument(); //make a dom object 
$doc->loadHTML($string); // load the string into the object 
$links = $doc->getElementsByTagName('a'); //get all links 
foreach ($links as $link) { //loop through all links 
    echo $link->nodeValue; //output text content of links 
} 

Выход:

Чикаго, Чикаго XXX Audio CD

Ссылки:
http://php.net/manual/en/domelement.getelementsbytagname.php
http://php.net/manual/en/domdocument.loadhtml.php

... или если вы действительно требуется регулярное выражение, по какой-то причине (я не» почему анализатор не работает) ...

$string = '<h3 class="lvtitle"><a href="http://www.ebay.com/itm/Chicago-Chicago-XXX-Audio-CD-/351478948979?hash=item51d5c72473" class="vip" title="Click this link to access Chicago, Chicago XXX Audio CD">Chicago, Chicago XXX Audio CD</a></h3>'; 
preg_match_all('~<a\h.*?>(.*?)</a>~', $string, $links_content); 
print_r($links_content[1]); 

Выход:

Array 
(
    [0] => Chicago, Chicago XXX Audio CD 
) 

~ = Разделитель
<a = буквально соответствует <a
\h = а горизонтальный Пустое пространство
.*? = ничего снимать черепицу первого появления следующего символа
> = буквального >
(.*?) = группировка захвата, захватывающая все до следующего символа
</a> = буквальный </a>
~ = закрывающий ограничитель

Если вы предпочитаете regex101 писать, https://regex101.com/r/sT6yA9/1.

Также обратите внимание на preg_match_all, в котором ваша строка содержит несколько ссылок. В одном случае вы можете использовать preg_match.

+0

Это лучший ответ, который я видел в то время. Отличная работа! – melwil

1

Регулярные выражения рода в этом случае ограничены, поскольку они не могут быть осведомлены о комментируемых текстовых областях и т.д.

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

.*"Click this link to access (.*?)".* 

http://regexr.com/3bjgn

+0

Спасибо за помощь. –

+0

@molnarpw добро пожаловать. Если это решит вашу проблему, тогда не стесняйтесь отмечать ответ как «принятый». Если вам понравился ответ, дайте ему +1! Благодаря! – slartidan