首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用正则表达式解析此HTML?

如何使用正则表达式解析此HTML?
EN

Stack Overflow用户
提问于 2013-02-20 07:10:51
回答 4查看 443关注 0票数 1

我正在尝试编写一个正则表达式来从HTML源中提取URL列表的hrefanchor文本。anchor文本可以是任何值。

HTML部分如下:

代码语言:javascript
复制
<div class="links"><a rel="nofollow" target="_blank" href="http://url1.com" class="get-all">URL1</a><a rel="nofollow" target="_blank" href="http://url2.com" class="get-all">This is Url-2</a><a rel="nofollow" target="_blank" href="http://url3.com" class="get-all">This is Url-3</a><a rel="nofollow" target="_blank" href="http://url4.com" class="get-all">Sweet URL 4</a></div>

我尝试了以下正则表达式,但它不起作用,因为它捕获了</a>标记之前的所有内容,并且失败了。

代码语言:javascript
复制
preg_match_('/<a rel="nofollow" target="_blank" href="(.*)" class="see-all">(.*)<\/a>/', $source , $website_array);

什么是一个有效的正则表达式来提取我需要的数据?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-20 07:15:58

如果你一定要知道,这个表达式是贪婪的,所以它可能会匹配第一个锚点的开始和最后一个锚点的结束;/U修饰符将修复这一点:

代码语言:javascript
复制
preg_match('/<a rel="nofollow" target="_blank" href="(.*)" class="see-all">(.*)<\/a>/U', $source , $website_array);

请注意,适用于无贪婪模式。

使用前瞻集合可能会提供更好的性能:

代码语言:javascript
复制
preg_match('/<a rel="nofollow" target="_blank" href="([^"]*)" class="see-all">([^<]*)<\/a>/', $source , $website_array);

这将在锚点内部的标记方面遇到麻烦。

有了上述限制,我会认真考虑使用HTML解析器:

代码语言:javascript
复制
$d = new DOMDocument;
$d->loadHTML($source);
$xp = new DOMXPath($d);
foreach ($xp->query('//a[@class="see-all"][@rel="nofollow"][@target="_blank"]') as $anchor) {
    $href = $anchor->getAttribute('href');
    $text = $anchor->nodeValue;
}

这将很高兴以不同的顺序处理属性,并使您能够进一步查询内部,等等。

票数 6
EN

Stack Overflow用户

发布于 2013-02-20 07:16:30

试一试

代码语言:javascript
复制
preg_match_all('/<a[^>]+href="([^"]+)"[^>]*>([^>]+)<\/a>/is', $source , $website_array);

它将匹配所有链接并返回一个包含信息的数组。备注:

^“-匹配除”之外的任何字符

票数 2
EN

Stack Overflow用户

发布于 2013-02-20 07:18:21

虽然使用正则表达式解析HTML通常不是一个好主意(我建议查看DOMDocument类以获得更好的解决方案),但在某些情况下可以使用它,在这种情况下,您对要提取的内容有非常明确的概念,并且可以确信在所有情况下,变量文本实际上不会破坏您的正则表达式。

对于您的情况,您可以尝试:

代码语言:javascript
复制
$pattern = '#<a rel="nofollow" target="_blank" href="(.*)" class="get-all">(.*)</a>#U';
preg_match_all($pattern, $source, $website_array);

注意末尾的不贪婪修饰符(U)。这对于只匹配可能的最小匹配非常重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14969368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档