Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenie regularne
Forum PHP.pl > Forum > Przedszkole
nieznany
Potrzebuję wyrażenia regularnego które znajdzie mi wszystkie znaki, aż do wystąpienia jakiegoś ciągu znaków.
Przykład
--WP
dfsdfs
df
-sd
sf
sd
--WP

powinno wyłapac

dfsdfs
dfsdfs
df
-sd
sf
sd

Kompinowałem z [^--WP]* ale to zatrzymuje się po znalezieni któregokolwiek ze znakó --WP
nospor
ech... przenoszę na php winksmiley.jpg

edit: na php poczatkujacy, gdyz tam goscie mogą postować
crash
  1. <?php
  2. $txt = 'abc
  3. --WP
  4. dfsdfs
  5. df
  6. -sd
  7. sf
  8. sd
  9. --WP
  10. asdas
  11. asd
  12. --AB
  13. asd
  14. cxad
  15. --AB
  16. asd';
  17.  
  18. preg_match_all( '/--([A-Z]+)(.*?)--\\1/s', $txt, $out );
  19.  
  20. $data = array();
  21. foreach( $out[ 1 ] as $id => $name )
  22. {
  23.  $data[ $name ] = trim( $out[ 2 ][ $id ] );
  24. }
  25.  
  26. print_r( $data );
  27. ?>
Guest
Dzięki za pomoc, ale jest jeszcze mały problem.
Jeśli twoje znaki --AB zamienię na --WP to nie wyłapie mi wszystkiego.
Powinno wyłapać

dfsdfs df -sd sf sd
asdas asd
asd cxad

a wyłapuje tylko

dfsdfs df -sd sf sd
asd cxad

gubjąc
asdas asd
crash
No i w czym problem? Pomyśleć trochę tongue.gif
Zamień:
  1. <?php
  2. $data[ $name ] = trim( $out[ 2 ][ $id ] );
  3. ?>

Na:
  1. <?php
  2. $data[ $name ][] = trim( $out[ 2 ][ $id ] );
  3. ?>
Guest
Cytat(crash @ 2006-02-17 17:29:32)
No i w czym problem? Pomyśleć trochę tongue.gif
Zamień:
  1. <?php
  2. $data[ $name ] = trim( $out[ 2 ][ $id ] );
  3. ?>

Na:
  1. <?php
  2. $data[ $name ][] = trim( $out[ 2 ][ $id ] );
  3. ?>

Oj chyba nie bardzo. Problem tkwi w tym, że twoje wyrażenie regularne wuszukuje wszystkie wystapienia danego ciągu ( i tak powinno być), ale po wyszukaniu pierwszego ciągu czyli
--WP
dfsdfs
df
-sd
sf
sd
--WP

dalej pozostaje do wyszukiwania ciąg
asdas
asd
--WP
asd
cxad
--WP
asd';

i z tego ciągu wyłapiemy kolejne wystąpienie
--WP
asd
cxad
--WP

a co się dzieję z
asdas
asd

nie znajduje tego bo na początku już nie ma --WP, a jest tylko

asdas
asd

--WP
asd
cxad
--WP
asd';
crash
Naprawdę już nie rozumiem co piszesz smile.gif Daj może przykład ciągu i co chcesz osiągnąć, póki co jest:
  1. <?php
  2. $txt = 'abc
  3. --WP
  4. dfsdfs
  5. df
  6. -sd
  7. sf
  8. sd
  9. --WP
  10. asdas
  11. asd
  12. --WP
  13. asd
  14. cxad
  15. --WP
  16. asd';
  17.  
  18. preg_match_all( '/--([A-Z]+)(.*?)--\\1/s', $txt, $out );
  19.  
  20. $data = array();
  21. foreach( $out[ 1 ] as $id => $name )
  22. {
  23.  $data[ $name ][] = trim( $out[ 2 ][ $id ] );
  24. }
  25.  
  26. print_r( $data );
  27. ?>

Co w wyniku daje:
Kod
Array
(
    [WP] => Array
        (
            [0] => dfsdfs
df
-sd
sf
sd
            [1] => asd
cxad
        )

)
Guest
Właśnie a powinno być

Array
(
[WP] => Array
(
[0] => dfsdfs
df
-sd
sf
sd
[1] => asdas
asd

[2] => asd
cxad
)

)
crash
No żeby taki był wynik to tekst musiałby wyglądać tak:
Kod
abc
--WP
dfsdfs
df
-sd
sf
sd
--WP
--WP
asdas
asd
--WP
--WP
asd
cxad
--WP
asd

Jak chcesz inaczej to pokombinuj może z:
  1. <?php
  2. print_r( explode( '--WP', $txt ) );
  3. ?>


-- edit:
A może to Cię zadowoli:
  1. <?php
  2. $pos  = -1;
  3. $data = array();
  4.  
  5. foreach( explode( "\n", $txt ) as $line )
  6. {
  7.    if( preg_match( '/^--([A-Z]{2,})$/', trim( $line ), $out ) )
  8.    {
  9.       $make = true;
  10.       $key  = $out[ 1 ];
  11.       $pos++;
  12.  
  13.       continue;
  14.    }
  15.    
  16.    if( $make == true )
  17.    {
  18.       $data[ $key ][ $pos ] .= $line . "\n";
  19.    }
  20. }
  21.  
  22. print_r( $data );
  23. ?>
Guest
OK. Dzieki za pomoc ja wykombinowałem coś takiego ( moj kod jest w C#)

Kod
      string format = Regex.Replace(_MAIL,"\n","");
      string t = Regex.Replace(_Boundary,"\\s","");
      Regex r = new Regex("--"+_Boundary+"(?<param>.*?)--"+t+"--");
      Match match = r.Match(format);
      string multiparts = match.Result("${param}");
      rich.AppendText("||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
      rich.AppendText(multiparts+"\n");
      rich.AppendText("||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");

      r = new Regex("(.*?)(--"+_Boundary+")?");
      MatchCollection mc = r.Matches(multiparts);
      
      for (int i = 0; i < mc.Count; i++)
      {
    rich.AppendText("||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
    rich.AppendText(mc[i].Value+"\n");
    rich.AppendText("||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
      }


Przy czym napis wygląda tak:
--WP
dfsdfs
df
-sd
sf
sd
--WP
asdas
asd
--WP
asd
cxad
--WP--
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.