Соответствует неизвестному числу вхождений на странице, используя perl? - PullRequest
1 голос
/ 09 августа 2010

Я анализирую HTML-страницу, скажем, на этой странице перечислены все игроки футбольной команды, и те, кто старшие, будут наглыми. Я не могу анализировать файл построчно и искать сильный тег, потому что в моем реальном примере шаблон намного сложнее и занимает несколько строк.

Примерно так:

<strong>Senior:</strong> John Smith
Junior: Joe Smith
<strong>Senior:</strong> Mike Johnson

и так далее. Как написать регулярное выражение Perl, чтобы получить имена всех старших?

Спасибо

Ответы [ 4 ]

6 голосов
/ 09 августа 2010

Причина, по которой вам трудно написать регулярное выражение, заключается в том, что это неправильный инструмент для работы.Вы должны использовать настоящий HTML-парсер, такой как HTML :: Parser , HTML :: TokeParser или HTML :: TreeBuilder .

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

3 голосов
/ 09 августа 2010

Вам не нужно разбирать файл построчно - вы можете читать весь файл сразу, если он маленький, или вы можете разбирать его по абзацам, используя любой разделитель, какой захотите.

Две магические вещи, которые вам нужно сделать, это: 1. установить переменную «разделитель строк», $/ (см. perldoc perlvar ), что-то другое, чем перевод строки, и 2. включить сопоставление многострочных регулярных выражений с модификатором /s (см. perldoc perlre ).

В качестве альтернативы вам следует использовать анализатор HTML, что вам и нужно делать, если вы пытаетесь найти такие вещи, как вложенные теги.

1 голос
/ 09 августа 2010

Вы должны предоставить конкретный пример.

Регулярные выражения Perl может быть иногда используется для анализа HTML, но только когда вы точно знаете, как выглядит страница и что она не слишком сложная.

Если вы не знаете точно или она слишком сложна, используйте парсеры, которые ссылаются на cjm.

0 голосов
/ 09 августа 2010

Из вашего примера неясно, как будет определяться конец старшего имени, но что-то вроде этого:

my @seniors = $filecontents =~ m!<strong>Senior:</strong>\s*([^<]+)!g;
...