Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie ciągu do określonych znaków.
Forum PHP.pl > Forum > PHP
Wankster
Więc tak:
Piszę sobie parser plików konfiguracyjnych (rozbudowane INI winksmiley.jpg) i natknąłem się na problem. Otóż komentarze komentarze rozpoczynają się od znaku # lub ;. Mogą też być na końcu wartości:
Kod
; To jest komentarz
; I to też :)

# To jest inny komentarz
# i to też

[Test] # Sekcja o nazwie Test :D
Nazwa = Wartość
Dwa = Druga wartość; A tu jest komentarz do tej wartości
Trzy = Chcem wyświetlić średnik: \; ale nie mogę \;(; Jak zrobić żeby usuwał tekst po; ale ignorował \;?

[DrugaSekcja]; Sekcja druga!
Tablica[] = 1
Tablica[Dwa] = 2; dwa


W sekcji Test elementu Trzy chcem wyświetlić średnik, ale średnik robi za komentarz, więc poprzedzam go znakiem \. Potrzebuje jakiegoś wyrażenia regularnego, które pobierze wszystko do pierwszego ; lub #, ale pominie \; i \#.
Tak jak jest w php $string = "quote \"s\" smile.gif";

Próbuję coś wymyśleć, ale nic nie działa tongue.gif
wassago
nie wgrzebujac sie w twoj problem.. nie lepiej uzyc parse_ini_file()" title="Zobacz w manualu PHP" target="_manual ?
Wankster
Nie Rkingsmiley.png
bendi
Poczytaj i bedzie po sprawie
1 2

Druga czesc moze CI sie okazac bardzo przydatna bo opisuje jak zrobic swoj kolorator skladni, wiec komentarze jednolinijkowe tez sa opisane. Jakby co uwagi na priva
Wankster
Dzięki, zrobiłem takie wyrażenie:
Kod
^(.*?)(?:[^\\\\](?:;|\/\/|#))
Tylko teraz jak dam taki string do sprawdzenia:
Kod
Jestem# sobie wartością \;) // Testowa wartość
To dostaje: Jeste. Zawsze, gdy napotka znak #, ; lub // ucina literkę poprzedzającą ten znak dry.gif
FiDO
  1. <?php
  2.  
  3. $t = array(&#092;"Trzy = Chcem wyświetlić średnik: ; ale nie mogę ;(; Jak zrobić żeby usuwał tekst po; ale ignorował ;?\",
  4. &#092;"Jestem# sobie wartością ;) // Testowa wartość\",
  5. &#092;"costam#; # komentarz\");
  6.  
  7. foreach ($t as $v) {
  8. preg_match('!(?:[;#]|[^#;])*!', $v, $m);
  9. print_r($m);
  10. }
  11.  
  12. ?>
bendi
Tak bedzie chyba lepiej winksmiley.jpg
  1. <?php
  2. $t = array(&#092;"Trzy = Chcem wyświetlić średnik: ; ale nie mogę ;(; Jak zrobić żeby usuwał tekst po; ale ignorował ;?\",
  3. &#092;"Jestem# sobie wartością ;) // Testowa wartość\",
  4. &#092;"costam#; # komentarz\",
  5. &#092;"#komentarz od poczatku linii\"
  6.  );
  7.  
  8. foreach ($t as $v) {
  9. preg_match('%(?<!)[#;](.*)%', $v, $m);
  10. print_r($m);
  11. }
  12.  
  13. ?>
FiDO
Tylko, ze Twoj kod pobiera sam komentarz, a nie wszystko do niego, a tego wlasnie oczekiwal autor piszac pierwszego posta smile.gif
bendi
Cytat(FiDO @ 2004-10-26 14:57:44)
Tylko, ze Twoj kod pobiera sam komentarz, a nie wszystko do niego, a tego wlasnie oczekiwal autor piszac pierwszego posta smile.gif

Bardzo mozliwe, ale zamien preg_match" title="Zobacz w manualu PHP" target="_manual na preg_replace" title="Zobacz w manualu PHP" target="_manual i zobaczysz co Ci zostanie w oryginalnym ciagu - w koncu chyba o to chodzi.

Jezeli zastosowac modyfikator /s to mozna sie pozbyc, wywolujac te regulke, wszystkich komentarzy z parsowanego pliku, no a od tego sie chyba zaczyna.
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.