Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> problem z konwersją do int wyniku wyrażenia regularnego
jacek k
post
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
zimi
post
Post #2





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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) bo mnie nastawili na nie jak na czyste zło (IMG:http://forum.php.pl/style_emoticons/default/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

Posty w temacie


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

 



RSS Aktualny czas: 5.10.2025 - 18:42