如何使用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,那么你认为它不会起作用。另外,根据您的帖子标题,您还想提取href
和id
属性的值,它们可能存在也可能不存在。事实上,他们中的任何一个都可能会失踪。
在这种情况下,您可以使用此正则表达式,
<(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
,以及将捕获href
和id
属性的值,两者都是可选的。
如果这是您想要的,请告诉我。如有任何疑问,请告诉我。
编辑使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?的主要内容,如果未能解决你的问题,请参考以下文章