Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Regex]Wyrażenie regularne
MateuszS
post
Post #1





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Witam, niestety w moim projekcie muszę użyć rzeczy, której totalnie nie rozumiem i nienawidzę (IMG:style_emoticons/default/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ł...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
redeemer
post
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
MateuszS
post
Post #3





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #4





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


A zwykłe [a-z]+ nie wystarczy?
Go to the top of the page
+Quote Post
MateuszS
post
Post #5





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


  1. std::regex pattern("<span id=\"num_[a-z]+\" class="">(.*)</span>");


nie działa
Go to the top of the page
+Quote Post
freemp3
post
Post #6





Grupa: Zarejestrowani
Postów: 467
Pomógł: 77
Dołączył: 6.09.2008
Skąd: Miechów / Kraków

Ostrzeżenie: (0%)
-----


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/
Go to the top of the page
+Quote Post
MateuszS
post
Post #7





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Niestety też nie działa. Może te spacje między wartością a tagami też coś psują?
Go to the top of the page
+Quote Post
gothye
post
Post #8





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

Ostrzeżenie: (0%)
-----


litera "i" na końcu pomoże pominąć spacje (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
MateuszS
post
Post #9





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


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="">")


Ten post edytował MateuszS 18.07.2013, 21:35:39
Go to the top of the page
+Quote Post
freemp3
post
Post #10





Grupa: Zarejestrowani
Postów: 467
Pomógł: 77
Dołączył: 6.09.2008
Skąd: Miechów / Kraków

Ostrzeżenie: (0%)
-----


Mógłbyś podać ten kawałek kodu, w którym wykonujesz sprawdzanie?
Go to the top of the page
+Quote Post
MateuszS
post
Post #11





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
freemp3
post
Post #12





Grupa: Zarejestrowani
Postów: 467
Pomógł: 77
Dołączył: 6.09.2008
Skąd: Miechów / Kraków

Ostrzeżenie: (0%)
-----


W takim razie wstaw tekst na sztywno do kodu, w tedy będziesz wiedział czy to wina kodowania czy wyrażenia.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.12.2025 - 12:11