我正在尝试从锚标记中提取文本,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
任何帮助将不胜感激。 谢谢
答案 0 :(得分:0)
您的问题有点不清楚,因此,如果我理解正确,则可以轻松提取锚标记(<a>
)的内容,但是如果<a
标记包含href和id,那么您认为这行不通。另外,根据您的帖子标题,您还希望提取href
和id
属性的值,它们可能存在也可能不存在。实际上,其中任何一个都可能丢失。
在这种情况下,您可以使用此正则表达式,
<(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组引用,根据上面的正则表达式,它们将为\1
,还将捕获a
和href
属性的值,两者均为可选。
让我知道这是否是您想要的。如有任何疑问,请告诉我。
答案 1 :(得分:0)
已对其进行编辑以使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* >