我正试图从html文件中获取DB中的信息,突然发现链接可能是这样的:
<a href="/blabla/12345678" class="someclass">channel crosstalk: <60dB</a>
我的正则表达式没有找到该链接:
preg_match_all('|<a href="/blabla/([0-9]+)"[^>]*>([^<]*)</a>|Uis',$html,$matches);
这是大正则表达式的一部分,我只是将其简化为例。
答案 0 :(得分: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%确定您正在寻找的确切结果,但也许这会让您继续前进,并且您可以根据需要进行修改。
答案 1 :(得分:0)
这是尝试使用正则表达式HTML的基本问题。这不是很好的HTML - 因为不打算被解释为HTML的内容应该是html实体(又名<e;
而不是<
)。但是你不会总能处理这个问题。
在你的情况下,这样的东西适用于正则表达式:
|<a href="/blabla/([0-9]+)">.*?</a>|Uis
匹配组被转移。这也允许嵌套标签(如<a><b><i></i></b></a>
)。
请记住,您使用的Ungreedy标记意味着您可以在正则表达式匹配中稍微宽松一点。如果你想在没有U
修饰符的情况下这样做,你可能需要做一些负面的预测。
|<a href="/blabla/([0-9]+)">(?:(?!</a>).)*</a>|is
答案 2 :(得分:0)
您可以使用此正则表达式提取 href 和链接文字。
<a[^>]+?href="(.*?)"[^>]+?>(.*?)</a>
Group 1
:href
Group 2
:链接文字