Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Wyrażenia regularne
styryl
post
Post #1





Grupa: Zarejestrowani
Postów: 223
Pomógł: 27
Dołączył: 16.04.2008
Skąd: Bakutilu

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


Muszę zrobić walidacje, warunków w sql i mam mały problem, mianowicie dostaję stringa np. "2 AND 2 AND 1 OR 2" gdzie pod liczby podstawiane są warunki. Aby było łatwiej usuwam przed sprawdzeniem wszystkie spacje co daje mi to:

  1. 2AND2AND1OR2


Sprawdzam takim wyrażeniem które działa:

  1. $check = '/^[0-9]{1}(((AND|OR)[0-9]{1})+)?$/i';


Mogą być używane tylko AND i OR. Ale mam problem jak sprawdzić czy poprawny jest np taki string (nawiasy, ułożenie liczb do podstawienia warunków itd):

  1. (1OR2)OR(1AND2OR(1AND2))


Ogólnie wyrażenia nie są mocną stroną w moim warsztacie umiejętności, stąd kierują do was prośbę o pomoc.
Go to the top of the page
+Quote Post
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Ja na Twoim miejscu nie bawiłbym się w wyrażenia regularne (a przynajmniej nie robiłbym tego tylko i wyłącznie na regexpach). Za to zbudowałbym prościutki parser, który zagłebiając się w kolejne nawiasy zamieniałby Twoje wyrażenie w ten sposób:

Kod
1. (1 OR 2) OR (1 AND 2 OR (1 AND 2))
2. W_1      OR (1 AND 2 OR W_2)
3. W_1      OR W_3
4. W_4


Zawartość kolejnych nawiasów mógłbyś walidować w sposób, jaki stosujesz dla prostych warunków.

Zresztą, jeśli chodzi tylko o poprawność składniową (ew. filtrowanie znaków), możesz pokusić się o usunięcie nawiasów, sprawdzenie poprawności wyrażenia i porównanie liczby nawiasów otwierających i zamykających. Bo jeśli to jest poprawne:
Kod
(1 OR 2) OR (1 AND 2 OR (1 AND 2))

to poniższe również musi być poprawne składniowo (chociaż może mieć inny sens logiczny):
Kod
1 OR 2 OR 1 AND 2 OR 1 AND 2


Ten post edytował sowiq 9.09.2013, 09:43:33
Go to the top of the page
+Quote Post
styryl
post
Post #3





Grupa: Zarejestrowani
Postów: 223
Pomógł: 27
Dołączył: 16.04.2008
Skąd: Bakutilu

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


Też tak myślałem, jednak o ile po usunięciu nawiasów przejdzie podstawowa walidacja to jednak porównanie ilości nawiasów odpada bo np:

  1. (1 OR 2)( OR( (1( AND) 2 OR (1 AND 2))))


To też przejdzie, więc chyba jedyną opcją będzie Twoja pierwsza propozycja budowy "małego parsera". Jednak nie ukrywam iż miałem nadzieję że uda się to zrobić wyrażeniem.
Go to the top of the page
+Quote Post
ber32
post
Post #4





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Witam
może tak jak dostajesz taki ciąg
Cytat
"2 AND 2 AND 1 OR 2"

  1. $check ="/\bAND|OR \b/i";
  2. $wiers ="(1 OR 2) OR (1 AND 2 OR (1 AND 2))";
  3. if(preg_match_all($check, $wiers, $pisz))
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.08.2025 - 10:44