从 HTML tag with regex获取所有属性

问题描述 投票:2回答:3

我已经有一个函数,该函数从给定标记页面上的所有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属性存储在相同的返回数据数组中?

php html regex pcre
3个回答
2
投票

您可以在该正则表达式上构建。看看:

'/<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', 

2
投票

尝试一下我刚回来的regextrainer。>>

该示例包含如下模式:<([^ ]+) ?([^>]*)>([^<]*)< ?/ ?\1>,它将捕获html中的属性。

我现在看到它不提取属性名称和值,而只是提取整个属性文本本身。使用它来提取属性详细信息:((([^=]+)=((?:"|'))([^"']+)\4) ?)+


0
投票

您可以使用beautifulsoup的select()方法找到目标标签,然后使用element.attrs获取保存在字典中的标签的所有属性。

© www.soinside.com 2019 - 2024. All rights reserved.