我已经有一个函数可以从给定标记页面上的所有href
标记中检索a
属性。但是,我还想检索其他属性,即title
属性。
我觉得这是对我已经使用的正则表达式的简单修改,但我唯一关心的是标记中出现的顺序。如果我有此代码的链接:
<a href="somepage.html" title="My Page">link text</a>
我希望它被解析相同并且不会导致任何错误,即使它看起来像这样:
<a title="My Page" href="somepage.html">link text</a>
这是我的处理功能:
function getLinks($src) {
if(preg_match_all('/<a\s+href=["\']([^"\']+)["\']/i', $src, $links, PREG_PATTERN_ORDER))
return array_unique($links[1]);
return false;
}
我是否必须一起使用另一个正则表达式,或者是否可以修改这个正则表达式,以便title
属性存储在与href
属性相同的返回数据数组中?< / p>
答案 0 :(得分:2)
试试这个regextrainer我做了一会儿。
示例包含如下模式:<([^ ]+) ?([^>]*)>([^<]*)< ?/ ?\1>
,它将捕获html中的属性。
我现在看到它不提取属性名称和值,只提取整个属性文本本身。使用此选项可提取属性详细信息:((([^=]+)=((?:"|'))([^"']+)\4) ?)+
答案 1 :(得分:1)
你可以建立在那个正则表达式上。看看:
'/<a(?:\s+(?:href=["\'](?P<href>[^"\'<>]+)["\']|title=["\'](?P<title>[^"\'<>]+)["\']|\w+=["\'][^"\'<>]+["\']))+/i'
......或以人类可读的形式:
preg_match_all(
'/<a
(?:\s+
(?:
href=["\'](?P<href>[^"\'<>]+)["\']
|
title=["\'](?P<title>[^"\'<>]+)["\']
|
\w+=["\'][^"\'<>]+["\']
)
)+/ix',
$subject, $result, PREG_PATTERN_ORDER);
我认为非常自我解释。请注意,您的原始正则表达式与外观顺序具有相同的问题。例如,它将无法匹配此标记:
<a class="someclass" href="somepage.html">link text</a>
除非您完全确定没有其他属性,否则您无法合理地期望首先列出href
。您可以使用与上面相同的噱头,其中第二个分支静默消耗并丢弃您不感兴趣的属性:
'/<a
(?:\s+
(?:
href=["\'](?P<href>[^"\'<>]+)["\']
|
\w+=["\'][^"\'<>]+["\']
)
)+/ix',