从<a> HTML tag with regex</a>获取所有属性

时间:2013-09-01 22:59:06

标签: php html regex pcre

我已经有一个函数可以从给定标记页面上的所有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>

2 个答案:

答案 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',