Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_replace - problem z wielokrotna zamiana wzoru
Forum PHP.pl > Forum > Przedszkole
NienawidzeRegExp
Witam,

Jest sobie parser plikow SQL dla PostgreSQL. Ze wzgledow kosmetycznych, pasowaloby oczyscic go z komentarzy wieloliniowych.
Przykladowy plik SQL:

  1. INSERT INTO something VALUES (blabla, blabla);
  2.  
  3. CREATE TABLE something (
  4. bnkjffhgkjdfhgjkhfdg fhgfdhg(10) NOT NULL
  5. dhfkjhdskjhdgdhg
  6. );
  7. --comment comment
  8. --comment comment
  9.  
  10. /*
  11. some more
  12. comment
  13. smore more more
  14. */
  15.  
  16. CREATE TABLE films (
  17. code char(5),
  18. title varchar(40),
  19. did integer,
  20. date_prod date,
  21. kind varchar(10),
  22. len interval hour TO minute,
  23. CONSTRAINT production UNIQUE(date_prod)
  24. );


Parser mieli plik i wrzuca zapytania SQL do zmiennej $sQuery. Aby oczyscic z komentarza wielonilionwego jade:

$sQuery = preg_replace(';(/\*)[\s\S]*(\*/);', '', $sQuery);

I wszystko dziala pieknie.
Jednak gdy plik SQL posiada drugi komentarz:

  1. INSERT INTO something VALUES (blabla, blabla);
  2.  
  3. CREATE TABLE something (
  4. bnkjffhgkjdfhgjkhfdg fhgfdhg(10) NOT NULL
  5. dhfkjhdskjhdgdhg
  6. );
  7. --comment comment
  8. --comment comment
  9.  
  10. /*
  11. some more
  12. comment
  13. smore more more
  14. */
  15.  
  16. CREATE TABLE films (
  17. code char(5),
  18. title varchar(40),
  19. did integer,
  20. date_prod date,
  21. kind varchar(10),
  22. len interval hour TO minute,
  23. CONSTRAINT production UNIQUE(date_prod)
  24. );
  25.  
  26. /*
  27. some more mmhhhgjh
  28. comment
  29. smore more more
  30. */


Po wyechowaniu:
  1. <?php
  2. echo $sQuery;
  3. ?>


Widac jedynie:

  1. INSERT INTO something VALUES (blabla, blabla); CREATE TABLE something ( bnkjffhgkjdfhgjkhfdg fhgfdhg(10) not null dhfkjhdskjhdgdhg );


Czy ktos moze mi wytknac moj przedszkolny blad? Chyba wypitych juz 5 kaw nie pozwala mi sie skupic.
-JeszczeRazJa-
  1. <?php
  2. var_dump(preg_match_all(';(/*)[sS]*(*/);', $sQuery, $aMatches));
  3. ?>


Zwraca true;

hmmm
-NienawidzeRegExp-
OK, jakos podolalem, co prawda niezbyt elegancko, ale nie bede tracil cennego czasu:

  1. <?php
  2. preg_match_all('//*([A-Za-zs]+)*//', $sQuery, $aMatches);
  3. $sQuery = str_replace($aMatches[0], '', $sQuery);
  4. ?>


Czas na kolejna kawe:P
-JuzOstatniRazJa-
OK, gdy nalewalem kolejna kawe mnie olsnilo:

  1. <?php
  2. $sQuery = preg_replace('#/*.**/#sU', '', $sQuery);
  3. ?>


Buziaki:)
nevt
masz zły wzorzec poszukiwania i tyle, zmień na:
  1. <?php
  2. $sQuery = preg_replace('#/*(.*?)*/#s', '', $sQuery);
  3. ?>
-noname-
Dzieki mistrzu. W zasadzie i moje ostatnie rozwiazanie i Twoje dziala. Na czym polega roznica?
nevt
heh - oba są tożsame (u ciebie modyfikator U robi to samo co u mnie znak zapytania po .*)- w dodatku jednocześnie je napisaliśmy, tylko kliknąłem dodaj odpowiedź chwilkę po tobie... żeby tak wszyscy jak ty potrafili samodzielnie rozwiązywać własne problemy... ech ... marzenia ... smile.gif
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.