preg_match链接带有小于号的文本

问题描述 投票:0回答:3

我正试图从html文件中获取DB中的信息,然后突然发现链接可能是这样的:

<a href="/blabla/12345678" class="someclass">channel crosstalk: <60dB</a>

我的正则表达式没有找到该链接:

preg_match_all('|<a href="/blabla/([0-9]+)"[^>]*>([^<]*)</a>|Uis',$html,$matches);

这是大正则表达式的一部分,我只是将其简化为例。

php regex preg-match preg-match-all
3个回答
0
投票

这是尝试使用正则表达式HTML的基本问题。这不是很好的HTML - 因为不打算被解释为HTML的内容应该是html实体(又名&lte;而不是<)。但是你并不总能处理这个问题。

在你的情况下,这样的东西适用于正则表达式:

|<a href="/blabla/([0-9]+)">.*?</a>|Uis

匹配组被移位。这也允许嵌套标签(如<a><b><i></i></b></a>)。

请记住,您使用的Ungreedy标记意味着您在正则表达式匹配中可能会略微松懈。如果你想在没有U修饰符的情况下这样做,你可能需要做一些负面的前瞻。

|<a href="/blabla/([0-9]+)">(?:(?!</a>).)*</a>|is

1
投票

很难说出你要拉的是什么。你在寻找整个链接吗?或者您是否希望从链接中获取零件(因此括号)?以下是获取链接中各个内容的解决方案:

preg_match_all( '#<a href="/.*?/(\d+)" class="(.*?)">(.*?)</a>#i', $html, $matches);

匹配的第一个元素是整个链接,而其他元素将是子部分。

或者这里只是整个链接的一个:

preg_match_all( "#(<a.*>.*</a>)#i", $html, $matches );

或者这里是你的略微修改版本,目前不匹配,因为它说匹配任何不是开头和关闭A标签内的尖括号,因为它的内容有一个尖括号:

preg_match_all( '|<a href="/blabla/([0-9]+)"[^>]*>(.*?)</a>|Uis', $html, $matches );

同样,不是100%确定您正在寻找的确切结果,但也许这将使您继续前进,您可以根据需要进行修改。


0
投票

您可以使用此正则表达式来提取href和链接文本。

<a[^>]+?href="(.*?)"[^>]+?>(.*?)</a>

Group 1:href

Group 2:链接文字

© www.soinside.com 2019 - 2024. All rights reserved.