Wyrażenie regularne wyciągające tekst z tagów html


(pain3hp) #1

Potrzebuję pomocy w napisaniu wyrażenia regularnego wyciągającego tekst z pomiędzy

<p class="title"> tekst do wyciągnięcia

w którym jak

widać

są znaki nowej lini



</p>

Proszę o pomoc, męczę się z tym już za długo 

Doszedłem tylko do etapu gdzie moge pobrać ostatnią linię 

^<p.*>.|\s*(.*)<\/p>$

 

 

 


(Drobok) #2

Ogólnie wyrażenia zachłanne to kiepski pomysł jeśli parsujesz strony z identyfikatorem class. P też nie powinieneś tak parsować, tylko wziąć wrzucić tam coś co ci zagnieździ (np nazwę tej klasy).

Coś w ten deseń powinno działać

^(<p(\s|.*?)>)(\s|.+)*?(</p>)$


(kostek135) #3

HTML nie jest językiem regularnym, więc używanie wyrażeń regularnych, żeby coś z niego wyciągnąć jest chorym pomysłem. HTML jest za to według klasyfikacji Chomskiego gramatyką bez kontekstową, więc idealnie do tego nada się biblioteka oparta o parser gramatyki bez kontekstowej, w której możesz podawać query stringi.
Znajdziesz coś takiego praktycznie dla każdego języka (najbardziej znane chyba swego czasu było jQuery, ale przeportowane jest to zapewne na każdy normalny język):
Dla PHP: http://j-php.net/wiki/Jsoup-Extension
Dla Java: https://jsoup.org/
Inne języki też zapewne coś takiego mają.


(pain3hp) #4

Ciekawe, query stringi są wyższą warstwą tych rozwiązań, a co siedzi w ich “bebachach”  jeśli nie wyrażenie regularne?


(kostek135) #5

Pisałem wyżej, generator parserów gramatyk bez kontekstowych, jeśli chcesz zobaczyć z czym to się je, to poszukaj dla:
C - flex+bison (ew. lex+yacc)
Java - antlr (ew. jflex+cup)
Scala - ma wbudowany, ale dość ubogi pakiet. Zrobiłem na podstawie tego prosty arythmetic resolver na blogu: http://www.dobreprogramy.pl/Piszemy-troche-mniej-zlozony-kalkulator,Blog,52021.html ale raczej nie należy się nastawiać na dogłębne omówienie tematu w tym wpisie. Po prostu nie mam na to czasu obecnie. Jakiś sensowny opis to na pewno z tydzień zbierania materiałów.

Dla innych języków nie znam bibliotek.


(djfoxer) #6

W C# jest świetny toolkit Html Agility Pack. Można w nim wyciągać dane z HTML zarówno za pomocą xpatha, jak i poprzez zapytania w LINQ.  


#7

PCRE masz modyfikator s (PCRE_DOTALL). Wtedy kropka będzie pasowała do znaków nowej linii i tekst normalnie się wyciągnie.

http://php.net/manual/pl/reference.pcre.pattern.modifiers.php

http://roadha.us/2009/03/consuming-newlines-with-the-javascript-regex-engine/