2
4

2 回答 2

3

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

'/<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', 
于 2013-09-02T03:09:23.543 回答
2

试试我不久前制作的这个regextrainer

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

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

于 2013-09-01T23:52:21.700 回答