#html #regex #perl
#HTML #регулярное выражение #perl
Вопрос:
У меня есть несколько веб-страниц для анализа, и есть ссылки, такие как
<a href="/news/monde/0,,3204267-VU5WX0lEIDUy,00.html" class="S48">Jean-Paul II opéré "avec succès" (24/02/2005)</a>
<a href="javascript:VerifCookie('4','/news/economie/0,,3204461-VU5WX0lEIDUy,00.html',700,600,52);" class="S48">Que peut-il se passer si le pape est incapable d'assurer sa tâche ? (24/02/2005)</a>
Как вы можете видеть, во втором есть основной материал JavaScript, и я хочу избавиться от него, а также быть совместимым с первым типом. Итак, я написал регулярное выражение на perl:
/<a href="[^/]*?([^<'] ?)[^"]*?" class="S48">([^<>] ?)</a>/
чтобы перехватить часть URL без javascript, а также часть заголовка. Но это регулярное выражение принимает только часть заголовка для меня, взятый URL-адрес — это просто «/» или «j».
Есть предложения?
Комментарии:
1. Вы не должны использовать регулярное выражение для этой задачи. Там, конечно, есть синтаксический анализатор HTML для perl. (Посмотрите на perl.active-venture.com/lib/HTML/Parser.html )
2. Вы хотите поймать /news/monde/0,,3204267-VU5WX0lEIDUy,00.html и /новости/экономика/0,,3204461-VU5WX0lEIDUy,00.html ?
3. @FailedDev Да, что часть URL, которую я хочу
4. @Jens спасибо, я попробую, но я все еще хочу выяснить, почему регулярное выражение не работает
5. Ссылка на документацию в комментариях выше устарела на много лет. Лучше: p3rl.org/HTML::Parser
Ответ №1:
Это регулярное выражение :
!<as*hrefs*=s*".*?(/.*.html).*"s class="S48">([^<>] ?)</a>!i
примененный к вашему вводу выдает следующие результаты для группы 1 :
/news/monde/0,,3204267-VU5WX0lEIDUy,00.html
/news/economie/0,,3204461-VU5WX0lEIDUy,00.html
и это для группы 2 :
Jean-Paul II opéré "avec succès" (24/02/2005)
Que peut-il se passer si le pape est incapable d'assurer sa tâche ? (24/02/2005)
Конечно, это работает с вашим конкретным вводом. Я бы настоятельно рекомендовал избегать использования регулярных выражений для .xml, .html, .xsl и т. Д. Для этой работы есть гораздо более эффективные инструменты.
Также гораздо более короткая версия :
/.*?(/.*.html).*?>([^<] )/i
Приведет к тем же результатам.