Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyrażenie regularne(odrzucenie znaku w środku szukanego stringu)
jackraymund
post
Post #1





Grupa: Zarejestrowani
Postów: 217
Pomógł: 21
Dołączył: 10.06.2011
Skąd: Głogów

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


Witam, mam pewien problem. Jak zrobić by funkcja mi nie zwracała znaku który się znajduje pomiędzy liczbami.
Wiem że mogę to zrobić str_replace albo preg_replace_callback, ale wole się spytać czy takie coś istnieje.
przykładowe stringi
  1. € 400,-
  2. € 1.400,-
  3. € 1.123.400,-
  4. € 1.234.112.123.400,-

I chodzi by nie uwzględniło mi kropki pomiędzy.
jeżeli użyje (?:\.) lub (?:\W) w szukanym stringu, i tak go uwzględni.
  1. preg_match('/€ ([\d(?:\.)]*?),-/is', '€ 1.400,-', $Preis);

return będzie 1.400, a chciałbym 1400
Jest taka możliwość w samym preg_matchu aby ominąć go?

Ten post edytował jackraymund 20.04.2014, 08:39:30


--------------------
Wykonuje zlecenia na pobieranie danych ze stron i różne boty.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Nawet gdyby istniała taka możliwość nie powinieneś tego robić - wyrażenie byłoby niepotrzebnie skomplikowane.
  1. if (preg_match('/^? ((?:\\d+\\.)*\\d+),-$/', '? 1.234.112.123.400,-', $m) !== 1) {
  2. throw new InvalidArgumentException('Niepoprawny format danych wejściowych');
  3. }
  4.  
  5. $result = (int) str_replace('.', '', $m[1]);
Prosty, bezpieczny kod, łatwy w utrzymaniu, zrozumieniu i utrzymaniu. Bez skomplikowanych wyrażeń regularnych nad których analizą zarówno programista jak i komputer musiałby spędzić zdecydowanie więcej czasu niż nad tym.

PS. W przypadku 32-bitowej instalacji PHP rzutowanie na INT w tym konkretnym przypadku będzie niemożliwe. Ot, porąbane uroki PHP. wink.gif
PS2. Z jakiegoś powodu forum zmienia symbol euro (na początku obu argumentów preg_match'a) na znak "?".

Ten post edytował Crozin 20.04.2014, 10:16:11
Go to the top of the page
+Quote Post
jackraymund
post
Post #3





Grupa: Zarejestrowani
Postów: 217
Pomógł: 21
Dołączył: 10.06.2011
Skąd: Głogów

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


Właśnie do INT'a chciałem te wartości sprowadzić, ale ta funkcja by nie zwróciła wartości poza kropką.
Btw. po co na podwójnych backslash'ah?
Wersja ((?:\d+\.)*\d+) działa identycznie. I zazwyczaj przed znakami specjalnymi uzywam jednego \. Jakaś różnica w szybkości przetwarzanego stringu, czy właściwości '' lub ""?
Jakbym mógł poprosić o więcej info(czytałem kiedyś o nich, ale niezbyt zrozumiałem), że np. w jakiś przypadkach dla jednego \ trzeba przedstawić za pomocą \\\\

PS. RE: Tak, a znajdź chociaż 64bitową wersje, jedyna opcja to bierz source i sam kompiluj(dobierz odpowiednio flagi biblioteki itd.), to są dopiero uroki... Próbowałem kiedyś zaalokować więcej niż 2gb. Z 2 dni mordęgi i 0 efektów.
PS2. RE: Taa, niestety ten edytor ma ten problem. Ale zawsze pozostaje tablica kodowania i bin2hex biggrin.gif

@down
co do tego 64bit, jak masz czas, spróbuj zaalokować więcej niż 2gb :] Teoria a praktyka, 2 różne światy, dostępy do binarek(działających!), jak już masz to musisz szukać bibliotek dodatkowych(których nie było w tych binarkach dostarczonych), i samemu kompilować, w tej samej wersji kompilatora, niema takiej w source to masz zonka, szukaj od nowa. Nawet te 64bitowe wersje po odpowiedniej konfiguracji nie chciały zaalokować;>
Powinni w końcu coś z tym zrobić.
Bynajmniej ja miałem takie doświadczenie z tym. Ni chuj, nie udało mi się tego osiągnąć. Próbowałem gdzieś z 1-2lata temu, do tej pory jak widzę, jest tak samo.

Ten post edytował jackraymund 20.04.2014, 12:48:51


--------------------
Wykonuje zlecenia na pobieranie danych ze stron i różne boty.
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Odnośnie backslashy:
W PHP jak i w masie innych języków służą one za znak ucieczki, tj.: "abc\"def" => abc"def, "abc\\def" => abc\def (bardzo logiczne). Jednak w PHP z jakiegoś powodu uznano, że jeżeli znak ucieczki postawiony jest przed czymś co nie jest znakiem specjalnym (czyli coś innego niż np. \n albo \0) to znak ucieczki pozostanie potraktowany dosłownie, i tak:
Kod
123\d321  => 123\d321
123\\d321 => 123\d321
123\n321  => 123
             321
123\\n321 => 123\n321

Czyli w teorii użyty przeze mnie podwójny backslash nie ma znaczenia, bo \\d zostanie zinterpretowane dokładnie tak samo jak \d, ale przynajmniej taki zapis nie korzysta z dziwnych "cudów" PHP-a. wink.gif

Trzeba tutaj jeszcze zaznaczyć, że czym innym jest znak specjalny w kontekście parsera PHP, a czym innym znak specjalny w kontekście parsera PCRE.

Cytat
PS. RE: Tak, a znajdź chociaż 64bitową wersje, jedyna opcja to bierz source i sam kompiluj(dobierz odpowiednio flagi biblioteki itd.), to są dopiero uroki... Próbowałem kiedyś zaalokować więcej niż 2gb. Z 2 dni mordęgi i 0 efektów.
Eee... chyba większość dystrybucji w paczkach na Linuksa jest 64-bitowa (na 64-bitowych systemach), a dla Windowsa są przygotowane paczki 64-bitowe. Nie mniej jednak za wprowadzenie zmiennej długości typu INT na różnych platformach rodem z C, deweloperom PHP należy się solidny... opiernicz. wink.gif

Ten post edytował Crozin 20.04.2014, 11:40:30
Go to the top of the page
+Quote Post
by_ikar
post
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Wątpię żeby \n, \0, \t etc zadziałało tak samo w apostrofie i w cudzysłowu, więc imo podwójny backslash jest tutaj zbędny. I fakt używanie tego sprawia problemy ale tylko kiedy używa się cudzysłowia. Można użyć podwójnego kiedy faktycznie chce się użyć backslasha na samym końcu stringa:

  1. function ('some string \\')
  2. {
  3. // ...
  4. }


A tak to użycie podwójnego wszędzie jest zbędne, o ile jak wcześniej napisałem, używa się apostrofu. Cudzysłów w php wprowadza masę zamieszania imo..

Ten post edytował by_ikar 20.04.2014, 13:02:48
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 15:45