HTML-разбор регулярных выражений - PullRequest
0 голосов
/ 14 августа 2011

Я хочу проанализировать документ HTML и получить псевдонимы всех пользователей.

Они в этом формате:

<a href="/nickname_u_2412477356587950963">Nickname</a>

Как я могу сделать это, используя регулярное выражение в PHP? Я не могу использовать DOMElement или простой разбор HTML.

Ответы [ 2 ]

3 голосов
/ 14 августа 2011
preg_match_all(
    '{                  # match when
        nickname_u_     # there is nickname_u
        [\d+]*          # followed by any number of digits
        ">              # followed by quote and closing bracket
        (.*)?           # capture anything that follows
        </a>            # until the first </a> sequence
    }xm',
    '<a href="/nickname_u_2412477356587950963">Nickname</a>',
    $matches
);
print_r($matches);

Применяются обычные заявления об отказе от использования Regex в HTML через анализатор HTML . Выше может быть улучшено для более надежного сопоставления. Это будет работать для примера, который вы привели.

3 голосов
/ 14 августа 2011

Вот рабочее решение без использования регулярного выражения:

DomDocument :: loadHTML () забывает достаточно, чтобы работать с искаженным HTML .

<?php
    $doc = new DomDocument;
    $doc->loadHTML('<a href="/nickname_u_2412477356587950963">Nickname</a>');

    $xpath = new DomXPath($doc);
    $nodes = $xpath->query('//a[starts-with(@href, "/nickname")]');

    foreach($nodes as $node) {
        $username = $node->textContent;
        $href = $node->getAttribute('href');
        printf("%s => %s\n", $username, $href);
    }
...