Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_replace
Forum PHP.pl > Forum > PHP
dtb
Mam kod:
  1. <?php
  2. $zmienna = preg_replace ('/([0-9]+)/', '$1', $zmienna); // dziala
  3. ?>

Jak widać kod zamiena w zmiennej '$zmienna' wszystkie cyfry na te same cyfry. Jednak chciałbym przepuścić te cyfry przez funkcje:
  1. <?php
  2. $zmienna = preg_replace ('/([0-9]+)/', funkcja('$1'), $zmienna); // blad
  3. $zmienna = preg_replace ('/([0-9]+)/', funkcja($1), $zmienna); // blad
  4. ?>

No właśnie. Błąd! Jak więc to zrobić?
L_Devil
Niestety tak się nie da zrobić jak ty myślisz - do funkcji jako parametr wysyłasz po prostu zmienną $l, ewentualnie string "$l" - a nie to co produkuje wyrażenie regularne. Jeżeli już koniecznie chcesz żeby te liczby przeszły przez funkcję, musisz użyć eval" title="Zobacz w manualu php" target="_manual:

(w komentarzach podałem wartości zmiennej $ciag)

  1. <?php
  2.  
  3. function funkcja($int)
  4. {
  5.  return $int*$int;
  6. }
  7.  
  8. $ciag = "to prawda że 23 jest większe od 15?";
  9. /*
  10. to prawda że 23 jest większe od 15?
  11. */
  12.  
  13. $ciag = '"' . $ciag . '";';
  14. /*
  15. "to prawda że 23 jest większe od 15?";
  16. */
  17.  
  18. $ciag = preg_replace ('/([0-9]+)/', '" . funkcja($1); . "', $zmienna);
  19. /*
  20. "to prawda że" . funkcja(23) . "jest większe od " . funkcja(15) . "?";
  21. */
  22.  
  23. $ciag = '$ciag = ' . $ciag;
  24. /*
  25. $ciag = "to prawda że" . funkcja(23) . "jest większe od " . funkcja(15) . "?";
  26. */
  27.  
  28. eval($ciag);
  29. /*
  30. to prawda że 529 jest większe od 225?
  31. */
  32.  
  33. ?>
Czyli o to nam chodziło smile.gif
dtb
Dzięki.
Uprościłem trochę twój kod:

  1. <?php
  2. function replace ($z, $na, $ciag)
  3. {
  4.     $ciag = '''.$ciag.'';';
  5.     $ciag = preg_replace ($z, $na, $ciag);
  6.     $ciag = '$ciag = '.$ciag;
  7.     eval ($ciag);
  8.     return $ciag;
  9. }
  10.  
  11. function repFun($fun)
  12. {
  13.     return ''.'.$fun.'.''
  14. }
  15.  
  16. $ciag = replace ('/([0-9]+)/', repFun(funkcja($1)), $ciag);
  17. ?>
legorek
A po co takie kombinacje?

Zobacz czy to zadziała:
  1. <?php
  2. $zmienna = preg_replace ('/([0-9]+)/e', 'funkcja(1)', $zmienna);
  3. ?>


Kiedyś sam miałe z tym problem. Modyfikator /e - działa jak eval. Ale bądź ostrożny przy jego stsowaniu.
dtb
aha, dzieki.
mam jeszcze maly problem:
  1. <?php
  2. $this->text = preg_replace('/((['.$mods.']+){0,}'.$modList[$i].'(['.$mods.']+){0,})'.[B]$value[/B].'/', '($1$2)'.$this->dave($value), $this->text);
  3. ?>

wyskakuje mi blad, natomiast przy:
  1. <?php
  2. $this->text = preg_replace('/((['.$mods.']+){0,}'.$modList[$i].'(['.$mods.']+){0,})'.[b]'xxx'[/b].'/', '($1$2)'.$this->dave($value), $this->text);
  3. ?>

tego bledu nie ma. jak widac aoba kody roznia sie tylko tym ze zamiast $value wpisano 'xxx', a jednak w przykladzie 1 jest blad, mimo ze zmienna $value ma wartosc 'xxx', czyli teoretycznie powinno byc dobrze
Czemu tak jest i jak to rozwiazac?
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.