Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [regexp] trochę skomplikowane wyrażenie (dla mnie)
Forum PHP.pl > Forum > PHP
Najki
Chciałem do swojego systemu news'ów dorobić pewną opcję, która przetworzy mi pewne dane w taki sposób, abym mógł z nich wygenerować ładną tabelkę z informacjami. W takim razie najlepiej jakby to wyrażenie wyjęło mi żądane przeze mnie elementy trafiły do jakiejś tablicy albo coś w tym stylu.

Niebardzo znam się na wyrażeniach regularnych, więc szczerze się przyznam, że proszę uprzejmie o to, aby ktoś mi napisał odpowiednie wyrażenie.

Użytkownik wprowadza coś takiego:
Kod
[mecz]"nazwa drużyny 1";"nazwa drużyny 2";10:0;"http://adres.obrazka/druzyna1.jpg";"http://adres.obrazka/druzyna2.jpg";"2006-01-13";"17:04";"dodatkowe informacje z możliwymi pogrubieniami itp. w stylu BBcode czyli np. [b]a[/b]"[/mecz]


Opisując dane:
Kod
[mecz]"drużyna1";"drużyna2";wynik1:wynik2;"adres obrazka druzyny1";"adres obrazka druzyny2";"data";"godzina";"informacje dodatkowe"[/mecz]


Proszę uprzejmie smile.gif.
crash
Może tak będzie łatwiej:
  1. <?php
  2. $games = array();
  3. if( preg_match_all( '#[mecz](.+?)[/mecz]#is', $x, $out ) )
  4. {
  5.    function removeQuotes( &$value, $key )
  6.    {
  7.       if( $key != 2 )
  8.       {
  9.          $value = substr( $value, 1, -);
  10.       }
  11.    }
  12.  
  13.    foreach( $out[ 1 ] as $game )
  14.    {
  15.       $dat = explode( ';', $game );
  16.       array_walk( $dat, 'removeQuotes' );
  17.       $score = explode( ':', $dat[ 2 ] );
  18.       $games[] = array( 
  19.                         'team1'  => $dat[ 0 ],
  20.                         'team2'  => $dat[ 1 ],
  21.                         'score1' => $score[ 0 ],
  22.                         'score2' => $score[ 1 ],
  23.                         'image1' => $dat[ 3 ],
  24.                         'image2' => $dat[ 4 ],
  25.                         'date'   => $dat[ 5 ],
  26.                         'time'   => $dat[ 6 ],
  27.                         'info'   => $dat[ 7 ]
  28.                       );
  29.    }
  30. }
  31.  
  32. print_r( $games );
  33. ?>

Oczywiście nie będzie to odporne na "lame users" znaczy podanie znaku " czy ; w treści popsuje wszystko, ale nie mam na tą chwilę lepszego pomysłu.
Najki
Działa, duże podziękowania smile.gif.
bela
  1. <?php
  2. preg_match_all('/[mecz](".*";)*[/mecz]/');
  3. ?>


Ja zrobiłbym to w taki sposób. Znając kolejność łatwo w tablicy znajdziesz swoje dane.
crash
No to do końca tak nie zadziała jak powinno, nie każda cześć jest ujęta w cudzysłowia, nie każda jest oddzielona średnikiem.
Najki
No, wszystkie oprócz wyniku są w cudzysłowiach. W zasadzie wynik można potraktować jako całość i nie rozbijać go explode'm przez dwukropek, bo to można później zrobić. W każdym razie wynik nie jest w cuszysłowiu, reszta tak.
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.