Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> problem z konwersją do int wyniku wyrażenia regularnego
jacek k
post 3.06.2007, 13:11:22
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
abc667
post 3.06.2007, 14:04:13
Post #2





Grupa: Zarejestrowani
Postów: 229
Pomógł: 0
Dołączył: 29.05.2007

Ostrzeżenie: (0%)
-----


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 ++ :-\

Ten post edytował abc667 3.06.2007, 14:04:46
Go to the top of the page
+Quote Post
zimi
post 3.06.2007, 14:43:26
Post #3





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
Kicok
post 3.06.2007, 17:13:06
Post #4





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował Kicok 4.06.2007, 08:38:48


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
jacek k
post 4.06.2007, 02:26:16
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----


zimi i Kicok, wielkie dzięki! bardzo mi pomogliście.

swoją drogą, musiałem jakoś przegapić str_replace, dobrze wiedzieć, że istnieje :)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 16:58