preg_match link 包含小于号的文本

preg_match link text with less-than sign in it

我试图从 html 个文件中获取数据库中的信息,突然发现 link 可以是这样的:

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

我的正则表达式没有找到 link:

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

这是大正则表达式的一部分,我只是简化了例子。

这是尝试使用正则表达式的根本问题 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

很难说出您要拉动什么。您要查找整个 link 吗?或者你想从 link 中获取零件(因此有括号)?这是获取 link 中各个内容的解决方案:

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

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

或者这里是整个 link:

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

或者这里是你的一个稍微修改过的版本,目前不匹配,因为它说要匹配开始和结束 A 标签内不是尖括号的任何内容,因为它的内容有一个尖括号:

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

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

您可以使用此正则表达式提取 hreflink text.

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

Group 1: href

Group 2: link 文字