Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Regex]Wyrażenie regularne
Forum PHP.pl > Forum > Przedszkole
MateuszS
Witam, niestety w moim projekcie muszę użyć rzeczy, której totalnie nie rozumiem i nienawidzę dostal.gif czyli wyrażeń regularnych. Co prawda projekt jest w C++ ale to chyba jedno i to samo jeżeli chodzi o wyrażenie regularne. Mam takie cudo

  1. <span id="num_a" class="">
  2. 2.098 </span>
  3.  
  4. ...
  5.  
  6. <span id="num_b" class="">
  7. 1.098 </span>
  8.  
  9.  
  10. ...
  11.  
  12. <span id="num_c" class="">
  13. 5.098 </span>


I muszę z tych trzech tagów wybrać wartości liczbowe. Jak widać zmienia się tylko "id" taga oraz sama wartość w tagu którą chcę pozyskać. Próbowałem różnych kombinacji z grupowaniem ale nie działa to tak jak bym chciał...
redeemer
Wyrażenia regularne nie za bardzo nadają się do parsowania HTML. http://www.mostthingsweb.com/2013/02/parsing-html-with-c/ Jeśli natomiast musisz skorzystać z wyrażeń regularnych to może:
Kod
/<span id="num_[a-z]" class="">(.*?)?<\/span>/s
MateuszS
Coś w tym stylu tylko zamiast tych [a-z] to musi być wyraz. Trochę faktycznie wprowadziłem w błąd bo gdyby to było sama jedna literka to nie byłoby takie trudne ale tu mam coś takiego bardziej.

  1. num_jeden
  2.  
  3. num_dwa
  4.  
  5. num_trzy


czyli wieloliterowe słowa. Oczywiście próbowałem z grupowaniem (.+) a także z alternatywą (jeden|dwa|trzy) tyle że mi to nie działa.
b4rt3kk
A zwykłe [a-z]+ nie wystarczy?
MateuszS
  1. std::regex pattern("<span id=\"num_[a-z]+\" class="">(.*)</span>");


nie działa
freemp3
Cytat(MateuszS @ 18.07.2013, 14:08:09 ) *
Co prawda projekt jest w C++ ale to chyba jedno i to samo jeżeli chodzi o wyrażenie regularne.

Niestety to nie jest jedno i to samo. PHP korzysta z POSIX oraz PCRE natomiast C++ z wyrażeń regularncyh ECMAScript.
To wyrażenie nie zadziała ponieważ "." oznacza wszystko oprócz nowej linii dlatego trzeba dodać do wyrażenia obsługę nowych linii. Całość wygląda tak:
Kod
<span id=\"num_[a-z]+\" class="">((?:.|\n)*)</span>


Dodatkowo polecam aby zapoznać się z tym:
http://www.cplusplus.com/reference/regex/ECMAScript/
MateuszS
Niestety też nie działa. Może te spacje między wartością a tagami też coś psują?
gothye
litera "i" na końcu pomoże pominąć spacje wink.gif
MateuszS
Chyba nie. W dokumentacji nie ma nic z samym "i". Próbowałem dodać i nie pomogło. W c++ za spacje chyba odpowiada \s (też próbowałem)

Co ciekawe nawet takigo czegoś nie znajduje

Kod
std::regex pattern("<span id=\"num_jeden\" class="">")
freemp3
Mógłbyś podać ten kawałek kodu, w którym wykonujesz sprawdzanie?
MateuszS
Z tego co się dowiedziałem chodzi o różne kodowanie znaków na stronie z której pobieram dane (UTF-8) i inne w konsoli C++. Mimo że oba stringi wyglądają identycznie, gdy je porównujemy program twierdzi że są różne.
freemp3
W takim razie wstaw tekst na sztywno do kodu, w tedy będziesz wiedział czy to wina kodowania czy wyrażenia.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.