繁体   English   中英

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

[英]How to extract id and url from an anchor tag in this code using PHP?

我正在尝试从锚标记中提取文本,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之类的参数时,这将行不通。 我正在尝试修改上述代码以以下方式打印Text(在2个锚标记之间),URL(HREF)和id

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

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

您的问题有点不清楚,因此,如果我理解正确,便可以轻松提取锚标记( <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> ->通过\\1反向引用匹配<a结束标记

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

这是一个演示

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

编辑以使id / href为可选

<a(?=\\s|>)(?=(?:(?:[^>"']|"[^"]*"|'[^']*')*?\\shref\\s*=\\s*(?:(['"])([\\S\\s]*?)\\1))?)(?=(?:(?:[^>"']|"[^"]*"|'[^']*')*?\\sid\\s*=\\s*(?:(['"])([\\S\\s]*?)\\3))?)\\s*(?:"[\\S\\s]*?"|'[\\S\\s]*?'|[^>]*?)+>(.*?)</a\\s*>

更换

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)
                ( [\S\s]*? )                  # (2)
                \1 
           )
      )?
 )
 (?=                           # Asserttion for optional:  id
      (?:
           (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
           \s id \s* = \s*           
           (?:
                ( ['"] )                      # (3)
                ( [\S\s]*? )                  # (4)
                \3 
           )
      )?
 )
                               # Have the href and id, just match the rest of tag
 \s* 
 (?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+

 >                             # End  tag

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM