2015-08-15 49 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音频CD”部分。

+0

尝试新鲜事物? – anubhava

+1

使用html解析器 –

+0

是的,我尝试了一个有用的函数来获取标签之间的字符串,但在这种情况下不起作用。 –

回答

3

分析器例如:

$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音频CD

参考文献:
http://php.net/manual/en/domelement.getelementsbytagname.php
http://php.net/manual/en/domdocument.loadhtml.php

...或者,如果你真的需要一个正则表达式出于某种原因(我不t看看解析器为什么不起作用)...

$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