如何使用PHP从此代码中的锚标记中提取id和url?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用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
";
      echo "<br>";
    }
    ?>
    </body>
    </html>

这将得到以下结果。

文字:解决方案

这样,我只能在两个纯锚标签之间打印文本(没有任何参数)。但是当存在诸如href和id之类的参数时,这不会起作用。我试图修改上面的代码,以下面的方式打印文本(2个锚标签之间),URL(HREF)和ID

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

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

答案

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

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

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

说明:

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

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

Here is a demo

如果这是您想要的,请告诉我。如有任何疑问,请告诉我。

另一答案

编辑使id / href可选

<a(?=s|>)(?=(?:(?:[^>"']|"[^"]*"|'[^']*')*?shrefs*=s*(?:(['"])([Ss]*?)1))?)(?=(?:(?:[^>"']|"[^"]*"|'[^']*')*?sids*=s*(?:(['"])([Ss]*?)3))?)s*(?:"[Ss]*?"|'[Ss]*?'|[^>]*?)+>(.*?)</as*>

更换

Text: $5 URL:$2 id:$4

https://regex101.com/r/SBgqqd/1

扩展

                               # Begin Anchor tag
 < a
 (?= s | > )
 (?=                           # Asserttion for optional:  href  (a pseudo atomic group)
      (?:
           (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
           s href s* = s* 
           (?:
                ( ['"] )                      # (1)
                ( [Ss]*? )                  # (2)
                1 
           )
      )?
 )
 (?=                           # Asserttion for optional:  id
      (?:
           (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
           s id s* = s*           
           (?:
                ( ['"] )                      # (3)
                ( [Ss]*? )                  # (4)
                3 
           )
      )?
 )
                               # Have the href and id, just match the rest of tag
 s* 
 (?: " [Ss]*? " | ' [Ss]*? ' | [^>]*? )+

 >                             # End  tag

 ( .*? )                       # (5)
 </a s* >

以上是关于如何使用PHP从此代码中的锚标记中提取id和url?的主要内容,如果未能解决你的问题,请参考以下文章

django模板中的锚标记不起作用

使用php从html页面中提取图像url

jQuery找到具有精确href的锚标记

如何从网页的不同超链接中提取数据

如何从 Python 中的 YouTube 链接中提取视频 ID?

[我想使用foreach循环php中的ajax来获取被点击行的UID,但获取所有UID