首页 > 解决方案 > 如何使用 PHP 从此代码中的锚标记中提取 id 和 url?

问题描述

我正在尝试从锚标记中提取文本、url(href) 和 id。到目前为止,我可以得到锚标签之间的文本。这是我的代码

<html>
    <head>
    </head>
    <body>
      <?php
    $html =<a href='https://www.google.lk/' id='21'>Google</a>  <a>Solution</a>"
    preg_match_all('@<(a)>(.+?)</\1>@is', $html, $matches);
    foreach ($matches[2] as $text) {
      print "Text: $text\n";
      echo "<br>";
    }
    ?>
    </body>
    </html>

这将给出以下结果。

文本:解决方案

这样,我只能打印2个纯锚标签之间的文本(不带任何参数)。但是当有 href 和 id 等参数时,这是行不通的。我正在尝试修改上述代码以按以下方式打印文本(在 2 个锚标记之间)、URL(HREF)和 id

文字:谷歌网址:https ://www.google.lk/id :21

任何帮助将不胜感激。谢谢

标签: phphtmlregextagsextract

解决方案


您的问题有点不清楚,所以如果我理解正确,您可以轻松提取锚标记 ( <a>) 内容,但如果<a标记包含 href 和 id,那么您认为它不起作用。另外,根据您的帖子标题,您还想提取hrefid属性的值,它们可能存在也可能不存在。事实上,它们中的任何一个都可能丢失。

在这种情况下,您可以使用此正则表达式,

<(a)(?:\s+href=(['"])(?<href>[^'"]*)\2\s*)?(?:\s+id=(['"])(?<id>[^'"]*)\4\s*)?>(.+?)<\/\1>

解释:

  • <--> 标签开始
  • (a)--> 期望标签名称仅为“a”,并将其捕获到组 1 中,以便通过在结束时的反向引用来匹配它
  • (?:\s+href=(['"])(?<href>[^'"]*)\2\s*)?--> 这部分匹配属性并在命名组中href捕获其值,这是可选的href
  • (?:id=(['"])(?<id>[^'"]*)\4\s*)?--> 这部分匹配id属性并捕获id命名组中的值,这也是可选的
  • ><a标签结束
  • (.+?)--> 捕获<a标签内部文本
  • <\/\1>--><a通过反向引用匹配结束标记\1

这仍将匹配a根据上述正则表达式的组 1 引用,并且还将捕获hrefid属性的值,两者都是可选的。

这是一个演示

让我知道这是否是你想要的。如有任何疑问,请告诉我。


推荐阅读