Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Wyszukanie ciągu znaków, Wyrażenia regularne
maniana
post
Post #1





Grupa: Zarejestrowani
Postów: 207
Pomógł: 44
Dołączył: 18.05.2007

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


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

Ten post edytował maniana 14.10.2010, 14:11:05
Go to the top of the page
+Quote Post
marcio
post
Post #2





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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 (IMG:style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
maniana
post
Post #3





Grupa: Zarejestrowani
Postów: 207
Pomógł: 44
Dołączył: 18.05.2007

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


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.
Go to the top of the page
+Quote Post
Fifi209
post
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Mało systemów szablonów masz? :| Zobacz jak to robią inni.

Ja osobiście nie widzę potrzeby wynajdywania koła na nowo.
Go to the top of the page
+Quote Post
maniana
post
Post #5





Grupa: Zarejestrowani
Postów: 207
Pomógł: 44
Dołączył: 18.05.2007

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


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 (IMG:style_emoticons/default/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

Ten post edytował maniana 14.10.2010, 22:03:40
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: 16.09.2025 - 03:31