Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenie regularne(odrzucenie znaku w środku szukanego stringu)
Forum PHP.pl > Forum > PHP
jackraymund
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?
Crozin
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 "?".
jackraymund
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.
Crozin
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
by_ikar
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..
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.