Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z konwersją do int wyniku wyrażenia regularnego
Forum PHP.pl > Forum > PHP
jacek k
Witajcie,

opiszę pokrótce swoją sytuację:
- przesyłam z poziomu klienta opis obrazka do PHP w formie ciągu hexowych opisów koloru kolejnych pixeli (np. fffdf8.ffffff.ffffff.ffffff.fefcf3 etc)
- ponieważ danych jest dużo, zaimplementowałem po stronie klienta prostą kompresję w rodzaju RLE, tzn. jeśli 3 kolejnych pixele mają taki sam kolor - powiedzmy ffffff, zapisuję to jako 3xffffff (przykładowy ciąg wygląda więc tak: fffdf8.3xffffff.fefcf3)
- żeby 'rozpakować' to po stronie serwera, używam następującej funkcji:

  1. <?php
  2. $datasetFull = ereg_replace("([0-9]{1,})x([a-z0-9]{1,6})", multiplyStrings("2", "1"), $dataset);
  3.  
  4. function multiplyStrings($string, $multiplier) {
  5. $output = '';
  6. $multiplier = (int) $multiplier;
  7. for($x=0;$x<$multiplier;$x++) {
  8. $output .= $string;
  9. }
  10. return $output;
  11. }
  12. ?>


i tu pojawia się problem... $multiplier (czyli n z nxffffff) po skonwertowaniu do int zawsze ma wartość zero! (jeśli jednak wypiszę go jako string, ma poprawną wartość n)
nie mam pojęcia, dlaczego tak się dzieje, próbowałem też z intval(), ale to nie pomogło.

nie jest to też na pewno problem danych przesyłanych od klienta, bo testowałem to również z wartością $dataset wpisaną do skryptu.

będę bardzo wdzięczny za wszelką pomoc.
gdyby ktoś chciał potestować, poniżej uproszczony kod zaznaczający problem.

  1. <?php
  2. $dataset = "ffffff.311xfefbed.f0d662.edcc3e.ecca34.ecca37.eccc3d.f1d86a.f4e18c.f9eebd.f
    fffff.4xfefbf0.f0d765.ebc729.ebc931.eecf49.f7eaad.fefcf3.faefc2.f7e7a5.efd358.eec
    f48.f6e59d.fffefa.ffffff"
    ;
  3. $datasetFull = ereg_replace("([0-9]{1,})x([a-z0-9]{1,6})", multiplyStrings("2", "1"), $dataset);
  4. echo $datasetFull;
  5.  
  6. function multiplyStrings($string, $multiplier) {
  7. $multiplierInt = (int) $multiplier;
  8. return '<b>'.$multiplier.': '.$multiplierInt.'</b>';
  9. }
  10. ?>
abc667
Dziwne to trochę, dodam od siebie że gdy użyjemy
  1. <?php
  2. $multiplierInt++;
  3. ?>

to dostajemy \\2 np fefbed
z tego co pamiętam z c++ to tak się wskaźnik zachowuje przy ++ :-\
zimi
jak na moje to regularkę masz nie do końca prawidłową... bo nx albo masz albo nie masz... a w regularce zawsze ma być... dlatego większości nie wychwytuję, ale mogę się mylić na ereg'ach się nie znam smile.gif bo mnie nastawili na nie jak na czyste zło smile.gif
poza tym jest taka funkcja jak str_repeat" title="Zobacz w manualu PHP" target="_manual
dlatego też proponuję:
  1. <?php
  2. $dataset = 'ffffff.3xfefbed.f0d662.edcc3e.ecca34.ecca37.eccc3d.f1d86a.f4e18c.f9eebd.ffffff.4
    xfefbf0.f0d765.ebc729.ebc931.eecf49.f7eaad.fefcf3.faefc2.f7e7a5.efd358.eecf48.f6e
    59d.fffefa.ffffff'
    ;
  3. $datasetFull = preg_match_all('@(([0-9]{1,})x)?([a-z0-9]{1,6})@', $dataset, $dopasowania);
  4. echo'<pre>';
  5. foreach($dopasowania[3] as $k=>$v){
  6. $a=$dopasowania[2][$k];
  7. $out.=str_repeat($v, $a?$a:1);
  8. }
  9. echo $out;
  10. ?>
Kicok
Wyrażenie było prawie dobre, bo z założenia miało zamieniać tylko te kolory, przed którymi znajduje się [0-9]+x
Tyle że ereg_replace nie za bardzo chce współpracować z funkcjami, więc trzeba użyć preg_replace z modyfikatorem "e":
  1. <?php
  2.  
  3. $dataset = 'ffffff.3xfefbed.f0d662.edcc3e.ecca34.ecca37.eccc3d.f1d86a.f4e18c.f9eebd.ffffff.4
    xfefbf0.f0d765.ebc729.ebc931.eecf49.f7eaad.fefcf3.faefc2.f7e7a5.efd358.eecf48.f6e
    59d.fffefa.ffffff'
    ;
  4. $datasetFull = preg_replace( '/([0-9]+)x([a-f0-9]+.)/ie', "str_repeat( '2', '1' )", $dataset );
  5.  
  6. echo( $datasetFull );
  7.  
  8. ?>
jacek k
zimi i Kicok, wielkie dzięki! bardzo mi pomogliście.

swoją drogą, musiałem jakoś przegapić str_replace, dobrze wiedzieć, że istnieje :)
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.