Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyrażenia regularne
Forum PHP.pl > Forum > PHP
styryl
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.
sowiq
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
styryl
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.
ber32
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))
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.