Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Wyszukanie ciągu znaków
Forum PHP.pl > Forum > PHP
maniana
Witam

Tworząc mały system template natrafiłem na problem związany z wyrażeniami regularnymi. Przetwarzam sobie taki plik:
  1. <p>To jest template</p>
  2. {%if(a='12' OR (b='abc' AND c='cba'))%}Wykonanie warunku{%/if%}
  3. <p>To jest koniec template</p>
Instrukcje mam zamknięte w {% i %} i wszystko działa ładnie, konwertuje sobie toto do wykonywalnych plików php. Problemy zaczęły się podczas przetwarzanie warunków IF.
Otóż wyrażeniem:
  1. preg_match('/^{%if(.*)%}/', $v, $matches)
ładnie wyłapuje to co jest w nawiasach ale teraz muszę to przetworzyć więc ciąg znaków:
  1. (a='12' OR (b='abc' AND c='cba'))
muszę zamienić na (przykładowo)
  1. ($a=='12' OR ($b=='abc' AND $c+='cba'))
Mój problem polega na skonstruowaniu wyrażenia wyłapującego ciągi znaków alfanumerycznych ale tylko takich które nie są zamknięte w apostrofach (w systemie abc ma oznaczać zmienną a 'abc' ciąg znaków, 123 to wartość liczbowa), oczywiście ciągi OR i AND będą pomijane w zamianie...

Jakieś sugestie jak ugryźć takie wyrażenie?

Edit: Przepraszam wkradł się błąd, przekształcone wyrażenie powinno wyglądać następująco:
  1. ($a=='12' OR ($b=='abc' AND $c=='cba'))
(= zamienione jest na ==, tez tego powyższego +)

Pozdrawiam
marcio
zamiast tak kombinowac i miec z tego plusy masz same minusy to jak juz chcesz uzywas alternatywnej skladni to uzywaj:
Kod
{%if($a=='12' OR ($b=='abc' AND $c+='cba'))%}Wykonanie warunku{%/if%}

Czyli tak rob skladnie zebys nie musial konwertowac twojego "jezyka" na php snitch.gif
maniana
No właśnie to było by za łatwe.
Tutaj chodzi o to by zostawić tylko pożądane elementy tego mojego "języka", w systemie template'sów mam zamiar odciąć się od PHP i przepuszczać tylko niektóre składnie (if, switch, for, include oraz niektóre operacje na tekście), wszystko po to by jak najbardziej odseparować szablony od silnika. Zauważ, że jest to bezpieczne zagranie bo wszystkie niedozwolone w szablonach rozkazy będą zamieniane na zmienne.
Fifi209
Mało systemów szablonów masz? :| Zobacz jak to robią inni.

Ja osobiście nie widzę potrzeby wynajdywania koła na nowo.
maniana
Cóż, systemów jest sporo, to prawda. Nie chce jednak używać czegoś z zewnątrz z uwagi na to, że jest to element większej aplikacji wchodzącej w skład pracy dyplomowej. Tak to sobie wymyśliłem, natknąłem się na problem i muszę go rozwiązać (z waszą pomocą). Sugestie bym wybrał gotowe rozwiązania tego problemu nie rozwiązują. Tu nie chodzi o to czy tworzenie nowego systemu szablonów ma sens czy nie tylko o to: Jak za pomocą wyrażeń regularnych wyciągnąć ciąg znaków alfanumerycznych nie zamkniętych w apostrofach smile.gif
Pozdrawiam

No i jest rozwiązanie, kolega Miwol, szybko, w kilku krokach doszedł do czegoś takiego:
  1. $str = "(a='12' OR (b='abc' AND c='cba'))";
  2. echo preg_replace("/([a-z]+)([=!+-\/<>]+)'([^']+)'/", "$\$1\$2'\$3'", preg_replace("/([a-z]+)='([^']+)'/", "\$1=='\$2'", $str));
W pierwszym wyrażeniu zamieniamy znaki porównania w drugim wyszukujemy 'zmienne'.
Pozdrawiam
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.