Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Wyrażenie regularne, optymalizacja
Lirdoner
post
Post #1





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

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


Witam, mam wyrażenie regularne które zamieni mi taki ciąg
Kod
{if $zmienna == $zmienna2}
aaaaaa
{else}
bbbbb
{/if}

Oczywiście warunek ($zmienna == $zmienna2) jest zmienny
Aktualnie robię to tak
  1. $file = preg_replace("#{if (.*)}#", "<?php if($1) { ?>", $file);
  2. $file = preg_replace("#{else}#", "<?php } else { ?>", $file);
  3. $file = preg_replace("#{/if}#", "<?php } ?>", $file);

No i wszystko działo ale jestem pewny, że można to zrobić w jednej linijce i nie wykorzystywać 3 funkcji preg_replace
Próbowałem na różne sposoby ale nie wyszło (IMG:style_emoticons/default/biggrin.gif)
Problem jeszcze jest taki, że chciałbym aby obsługiwało to też taki ciąg
Kod
{if $zmienna == $zmienna2}aaaaaa{else}bbbbb{/if}

Bo przy powyższym sposobie są błędy (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A o str_replace czasem słyszałeś? (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Lirdoner
post
Post #3





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

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


Pewno, że słyszałem ale nie użyję w nim wyrażeń regularnych które mi są niezbędne do zastąpienia {if $zmienna == $zmienna2}
Pogrubiona wartość jest zmienna, skrypt nie ma pojęcia co się tam kryje dlatego potrzebuję skorzystać z wyrażeń regularnych

str_replace mogę jednak użyć przy {else} i {/if} ale czy to będzie dobre rozwiązanie skoro mogę wszystko za jednym zamachem przez preg_replace?
Go to the top of the page
+Quote Post
buliq
post
Post #4





Grupa: Zarejestrowani
Postów: 559
Pomógł: 93
Dołączył: 4.03.2008
Skąd: Olsztyn

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


  1. #{if ((.)*?)}((.|\n)*?)(({else})*?)((.|\n)*?){\/if((.)*?)}#iu

?

Zapewne można bardziej optymalnie, ale to tak pisane z palca (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Pogrubiona wartość jest zmienna, skrypt nie ma pojęcia co się tam kryje dlatego potrzebuję skorzystać z wyrażeń regularnych

Ale zważ na to, że sprawdzane wyrażenie jest zgodne ze składnią pehapca, więc nadal wystarczy Ci str_replace.
Go to the top of the page
+Quote Post
by_ikar
post
Post #6





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


A nie lepiej użyć alternatywnej składni php?

  1. {if($warunek):}
  2. // something
  3. {else:}
  4. // something else
  5. {endif;}


Jedynie zamieniając klamry na tagi php ?

O alternatywnej składni bloków kodu (pętli, warunków) poczytać możesz w dokumentacji: Alternative syntax for control structures

EDIT: tak teraz zajrzałem dokładnie do pierwszego posta, tj do listingu kodu jaki podałeś i powiem ci tak, zajrzyj do dokumentacji preg_replace, możesz zamiast jednego wyrażenia podać ich kilka, w tablicy. Jak podajesz w tablicy wzorce, to w drugim argumencie musisz podać tablicę zastępowanego ciągu:

  1. <?php
  2.  
  3. $pattern = array('#{if (.*)}#is', '"#{else}#"is', '#{/if}#is');
  4. $replacement = array('<?php if($1) { ?>', '<?php } else { ?>', '<?php } ?>');
  5.  
  6. $file = preg_replace($pattern, $replacement, $file);


Tyle że w taki sposób tobie to będziesz musiał zrobić zyliard wyrażeń regularnych i pamiętać cały czas składnie takiego szablonu. W przypadku zapisu alternatywnego, nie tworzysz niczego nowego, bo to już jest od dość dawna w dokumentacji. Tutaj już masz w sumie gotowe rozwiązanie: http://forum.php.pl/index.php?showtopic=18...t-member-921998 które właśnie oparłem o alternatywny zapis struktur kontrolnych (warunki, pętle etc). Może ci to w czymś pomoże (IMG:style_emoticons/default/wink.gif)

Ten post edytował by_ikar 30.12.2011, 18:25:56
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: 22.08.2025 - 12:28